From 6399df4c337383c9bbc17ecd6ad2e9feac9751ba Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 6 Mar 2015 21:17:26 -0500 Subject: [PATCH] tweaks --- SwiftIO/SocketEngine.swift | 154 ++++++++++++++++--------------- SwiftIO/SocketEventHandler.swift | 5 +- SwiftIO/SocketIOClient.swift | 44 +++++---- 3 files changed, 103 insertions(+), 100 deletions(-) diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index 8d6b961..1c74338 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -151,29 +151,29 @@ class SocketEngine: NSObject, SRWebSocketDelegate { self.waitingForPoll = true self.session.dataTaskWithRequest(req) {[weak self] data, res, err in - if self == nil { - return - } else if err != nil { - if self!.polling { - self?.handlePollingFailed(err) - } + if self == nil { + return + } else if err != nil { + if self!.polling { + self?.handlePollingFailed(err) + } + return + } + + // println(data) + + if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String { + // println(str) + + dispatch_async(self?.parseQueue) {[weak self] in + self?.parsePollingMessage(str) return } - - // println(data) - - if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String { - // println(str) - - dispatch_async(self?.parseQueue) {[weak self] in - self?.parsePollingMessage(str) - return - } - } - - self?.waitingForPoll = false - self?.doPoll() - }.resume() + } + + self?.waitingForPoll = false + self?.doPoll() + }.resume() } private func flushProbeWait() { @@ -229,12 +229,16 @@ class SocketEngine: NSObject, SRWebSocketDelegate { self?.handlePollingFailed(err) } return + } else if self == nil { + return } - self?.flushWaitingForPost() self?.waitingForPost = false - self?.doPoll() - }.resume() + dispatch_async(self!.emitQueue) { + self?.flushWaitingForPost() + self?.doPoll() + return + }}.resume() } // We had packets waiting for send when we upgraded @@ -252,6 +256,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate { private func handlePollingFailed(reason:NSError?) { if !self.client.reconnecting { self.connected = false + self.ws?.close() self.pingTimer?.invalidate() self.waitingForPoll = false self.waitingForPost = false @@ -271,61 +276,58 @@ class SocketEngine: NSObject, SRWebSocketDelegate { let reqPolling = NSURLRequest(URL: NSURL(string: urlPolling + "&b64=1")!) self.session.dataTaskWithRequest(reqPolling) {[weak self] data, res, err in - var err:NSError? - if self == nil { - return - } else if err != nil || data == nil { - if self!.polling { - self?.handlePollingFailed(err) - } + var err2:NSError? + if self == nil { + return + } else if err != nil || data == nil { + self?.handlePollingFailed(err) + return + } + + if let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) { + var mutString = RegexMutable(dataString) + let parsed:[String]? = mutString["(\\d*):(\\d)(\\{.*\\})?"].groups() + + if parsed == nil || parsed?.count != 4 { return } - if let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) { - var mutString = RegexMutable(dataString) - let parsed = mutString["(\\d*):(\\d)(\\{.*\\})?"].groups() - - if parsed.count != 4 { - return - } - - let length = parsed[1] - let type = parsed[2] - let jsonData = parsed[3].dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) - - if type != "0" { - NSLog("Error handshaking") - return - } - - self?.connected = true - - if let json = NSJSONSerialization.JSONObjectWithData(jsonData!, - options: NSJSONReadingOptions.AllowFragments, error: &err) as? NSDictionary { - if let sid = json["sid"] as? String { - // println(json) - self?.sid = sid - - if !self!.forcePolling { - self?.ws = SRWebSocket(URL: - NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!) - self?.ws?.delegate = self - self?.ws?.open() - } - } else { - NSLog("Error handshaking") - return - } - - if let pingInterval = json["pingInterval"] as? Int { - self?.pingInterval = pingInterval / 1000 - } - } - - self?.doPoll() - self?.startPingTimer() + let length = parsed![1] + let type = parsed![2] + let jsonData = parsed![3].dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) + + if type != "0" { + NSLog("Error handshaking") + return } - }.resume() + + self?.connected = true + + if let json = NSJSONSerialization.JSONObjectWithData(jsonData!, + options: NSJSONReadingOptions.AllowFragments, error: &err2) as? NSDictionary { + if let sid = json["sid"] as? String { + // println(json) + self?.sid = sid + + if !self!.forcePolling { + self?.ws = SRWebSocket(URL: + NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!) + self?.ws?.delegate = self + self?.ws?.open() + } + } else { + NSLog("Error handshaking") + return + } + + if let pingInterval = json["pingInterval"] as? Int { + self?.pingInterval = pingInterval / 1000 + } + } + + self?.doPoll() + self?.startPingTimer() + }}.resume() } // Translatation of engine.io-parser#decodePayload @@ -525,7 +527,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate { if self.pingInterval == nil { return } - + self.pingTimer?.invalidate() dispatch_async(dispatch_get_main_queue()) { self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(self.pingInterval!), target: self, diff --git a/SwiftIO/SocketEventHandler.swift b/SwiftIO/SocketEventHandler.swift index 87e8a16..c59e92c 100644 --- a/SwiftIO/SocketEventHandler.swift +++ b/SwiftIO/SocketEventHandler.swift @@ -45,6 +45,9 @@ class SocketEventHandler { func executeCallback(_ items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, withSocket socket:SocketIOClient? = nil) { - callback?(items, ack != nil ? emitAckCallback(socket!, ack!, type!) : nil) + dispatch_async(dispatch_get_main_queue()) {[weak self] in + self?.callback?(items, ack != nil ? emitAckCallback(socket!, ack!, type!) : nil) + return + } } } \ No newline at end of file diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index c3d76c8..a37f641 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -280,30 +280,28 @@ class SocketIOClient { } for handler in self.handlers { if handler.event == event { - dispatch_async(dispatch_get_main_queue()) { - if data is NSArray { - if ack != nil { - handler.executeCallback(data as? NSArray, withAck: ack!, - withAckType: ackType, withSocket: self) - } else { - handler.executeCallback(data as? NSArray) - } + if data is NSArray { + if ack != nil { + handler.executeCallback(data as? NSArray, withAck: ack!, + withAckType: ackType, withSocket: self) } else { - - // Trying to do a ternary expression in the executeCallback method - // seemed to crash Swift - var dataArr:NSArray? = nil - - if let data:AnyObject = data { - dataArr = [data] - } - - if ack != nil { - handler.executeCallback(dataArr, withAck: ack!, - withAckType: ackType, withSocket: self) - } else { - handler.executeCallback(dataArr) - } + handler.executeCallback(data as? NSArray) + } + } else { + + // Trying to do a ternary expression in the executeCallback method + // seemed to crash Swift + var dataArr:NSArray? = nil + + if let data:AnyObject = data { + dataArr = [data] + } + + if ack != nil { + handler.executeCallback(dataArr, withAck: ack!, + withAckType: ackType, withSocket: self) + } else { + handler.executeCallback(dataArr) } } }