async logging, simplify acks
This commit is contained in:
parent
acefc89b0d
commit
4be6b58150
@ -24,32 +24,47 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
private struct SocketAck: Hashable, Equatable {
|
||||
let ack:Int
|
||||
var callback:AckCallback!
|
||||
var hashValue:Int {
|
||||
return ack.hashValue
|
||||
}
|
||||
|
||||
init(ack:Int) {
|
||||
self.ack = ack
|
||||
}
|
||||
|
||||
init(ack:Int, callback:AckCallback?) {
|
||||
self.ack = ack
|
||||
self.callback = callback
|
||||
}
|
||||
}
|
||||
|
||||
private func <(lhs:SocketAck, rhs:SocketAck) -> Bool {
|
||||
return lhs.ack < rhs.ack
|
||||
}
|
||||
|
||||
private func ==(lhs:SocketAck, rhs:SocketAck) -> Bool {
|
||||
return lhs.ack == rhs.ack
|
||||
}
|
||||
|
||||
struct SocketAckMap {
|
||||
private var acks = [Int: AckCallback]()
|
||||
private var waiting = [Int: Bool]()
|
||||
private var acks = Set<SocketAck>(minimumCapacity: 1)
|
||||
|
||||
mutating func addAck(ack:Int, callback:AckCallback) {
|
||||
waiting[ack] = true
|
||||
acks[ack] = callback
|
||||
self.acks.insert(SocketAck(ack: ack, callback: callback))
|
||||
}
|
||||
|
||||
mutating func executeAck(ack:Int, items:[AnyObject]?) {
|
||||
let callback = acks[ack]
|
||||
waiting[ack] = false
|
||||
|
||||
let callback = self.acks.remove(SocketAck(ack: ack))
|
||||
|
||||
dispatch_async(dispatch_get_main_queue()) {
|
||||
callback?(items)
|
||||
callback?.callback(items)
|
||||
}
|
||||
|
||||
acks.removeValueForKey(ack)
|
||||
}
|
||||
|
||||
mutating func timeoutAck(ack:Int) {
|
||||
if waiting[ack] != nil && waiting[ack]! {
|
||||
acks[ack]?(["NO ACK"])
|
||||
}
|
||||
|
||||
acks.removeValueForKey(ack)
|
||||
waiting.removeValueForKey(ack)
|
||||
self.acks.remove(SocketAck(ack: ack))?.callback(["NO ACK"])
|
||||
}
|
||||
}
|
||||
|
||||
@ -30,15 +30,21 @@ protocol SocketLogClient {
|
||||
}
|
||||
|
||||
final class SocketLogger {
|
||||
private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL)
|
||||
|
||||
static func log(message:String, client:SocketLogClient, altType:String? = nil) {
|
||||
if client.log {
|
||||
NSLog("%@: %@", altType ?? client.logType, message)
|
||||
dispatch_async(printQueue) {
|
||||
if client.log {
|
||||
NSLog("%@: %@", altType ?? client.logType, message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static func err(message:String, client:SocketLogClient, altType:String? = nil) {
|
||||
if client.log {
|
||||
NSLog("ERROR %@: %@", altType ?? client.logType, message)
|
||||
dispatch_async(printQueue) {
|
||||
if client.log {
|
||||
NSLog("ERROR %@: %@", altType ?? client.logType, message)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user