From 4be6b581503215b3109ac0e94fba3dac7980dd87 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 14 Apr 2015 17:13:39 -0400 Subject: [PATCH] async logging, simplify acks --- SocketIOClientSwift/SocketAckMap.swift | 47 +++++++++++++++++--------- SocketIOClientSwift/SocketLogger.swift | 14 +++++--- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/SocketIOClientSwift/SocketAckMap.swift b/SocketIOClientSwift/SocketAckMap.swift index eac1a90..d2940ea 100644 --- a/SocketIOClientSwift/SocketAckMap.swift +++ b/SocketIOClientSwift/SocketAckMap.swift @@ -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(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"]) } } diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index a5f33a2..fceb2ee 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -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) + } } } }