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
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"])
}
}

View File

@ -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)
}
}
}
}