async logging, simplify acks

This commit is contained in:
Erik 2015-04-14 17:13:39 -04:00
parent acefc89b0d
commit 4be6b58150
2 changed files with 41 additions and 20 deletions

View File

@ -24,32 +24,47 @@
import Foundation 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 { struct SocketAckMap {
private var acks = [Int: AckCallback]() private var acks = Set<SocketAck>(minimumCapacity: 1)
private var waiting = [Int: Bool]()
mutating func addAck(ack:Int, callback:AckCallback) { mutating func addAck(ack:Int, callback:AckCallback) {
waiting[ack] = true self.acks.insert(SocketAck(ack: ack, callback: callback))
acks[ack] = callback
} }
mutating func executeAck(ack:Int, items:[AnyObject]?) { mutating func executeAck(ack:Int, items:[AnyObject]?) {
let callback = acks[ack] let callback = self.acks.remove(SocketAck(ack: ack))
waiting[ack] = false
dispatch_async(dispatch_get_main_queue()) { dispatch_async(dispatch_get_main_queue()) {
callback?(items) callback?.callback(items)
} }
acks.removeValueForKey(ack)
} }
mutating func timeoutAck(ack:Int) { mutating func timeoutAck(ack:Int) {
if waiting[ack] != nil && waiting[ack]! { self.acks.remove(SocketAck(ack: ack))?.callback(["NO ACK"])
acks[ack]?(["NO ACK"])
}
acks.removeValueForKey(ack)
waiting.removeValueForKey(ack)
} }
} }

View File

@ -30,15 +30,21 @@ protocol SocketLogClient {
} }
final class SocketLogger { final class SocketLogger {
private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL)
static func log(message:String, client:SocketLogClient, altType:String? = nil) { static func log(message:String, client:SocketLogClient, altType:String? = nil) {
if client.log { dispatch_async(printQueue) {
NSLog("%@: %@", altType ?? client.logType, message) if client.log {
NSLog("%@: %@", altType ?? client.logType, message)
}
} }
} }
static func err(message:String, client:SocketLogClient, altType:String? = nil) { static func err(message:String, client:SocketLogClient, altType:String? = nil) {
if client.log { dispatch_async(printQueue) {
NSLog("ERROR %@: %@", altType ?? client.logType, message) if client.log {
NSLog("ERROR %@: %@", altType ?? client.logType, message)
}
} }
} }
} }