This commit is contained in:
Erik 2015-03-06 21:17:26 -05:00
parent 14bf64233b
commit 6399df4c33
3 changed files with 103 additions and 100 deletions

View File

@ -151,29 +151,29 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self.waitingForPoll = true self.waitingForPoll = true
self.session.dataTaskWithRequest(req) {[weak self] data, res, err in self.session.dataTaskWithRequest(req) {[weak self] data, res, err in
if self == nil { if self == nil {
return return
} else if err != nil { } else if err != nil {
if self!.polling { if self!.polling {
self?.handlePollingFailed(err) 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 return
} }
}
// println(data)
self?.waitingForPoll = false
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String { self?.doPoll()
// println(str) }.resume()
dispatch_async(self?.parseQueue) {[weak self] in
self?.parsePollingMessage(str)
return
}
}
self?.waitingForPoll = false
self?.doPoll()
}.resume()
} }
private func flushProbeWait() { private func flushProbeWait() {
@ -229,12 +229,16 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self?.handlePollingFailed(err) self?.handlePollingFailed(err)
} }
return return
} else if self == nil {
return
} }
self?.flushWaitingForPost()
self?.waitingForPost = false self?.waitingForPost = false
self?.doPoll() dispatch_async(self!.emitQueue) {
}.resume() self?.flushWaitingForPost()
self?.doPoll()
return
}}.resume()
} }
// We had packets waiting for send when we upgraded // We had packets waiting for send when we upgraded
@ -252,6 +256,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
private func handlePollingFailed(reason:NSError?) { private func handlePollingFailed(reason:NSError?) {
if !self.client.reconnecting { if !self.client.reconnecting {
self.connected = false self.connected = false
self.ws?.close()
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self.waitingForPoll = false self.waitingForPoll = false
self.waitingForPost = false self.waitingForPost = false
@ -271,61 +276,58 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
let reqPolling = NSURLRequest(URL: NSURL(string: urlPolling + "&b64=1")!) let reqPolling = NSURLRequest(URL: NSURL(string: urlPolling + "&b64=1")!)
self.session.dataTaskWithRequest(reqPolling) {[weak self] data, res, err in self.session.dataTaskWithRequest(reqPolling) {[weak self] data, res, err in
var err:NSError? var err2:NSError?
if self == nil { if self == nil {
return return
} else if err != nil || data == nil { } else if err != nil || data == nil {
if self!.polling { self?.handlePollingFailed(err)
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 return
} }
if let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) { let length = parsed![1]
var mutString = RegexMutable(dataString) let type = parsed![2]
let parsed = mutString["(\\d*):(\\d)(\\{.*\\})?"].groups() let jsonData = parsed![3].dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
if parsed.count != 4 { if type != "0" {
return NSLog("Error handshaking")
} 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()
} }
}.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 // Translatation of engine.io-parser#decodePayload
@ -525,7 +527,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if self.pingInterval == nil { if self.pingInterval == nil {
return return
} }
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
dispatch_async(dispatch_get_main_queue()) { dispatch_async(dispatch_get_main_queue()) {
self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(self.pingInterval!), target: self, self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(self.pingInterval!), target: self,

View File

@ -45,6 +45,9 @@ class SocketEventHandler {
func executeCallback(_ items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, func executeCallback(_ items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil,
withSocket socket:SocketIOClient? = 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
}
} }
} }

View File

@ -280,30 +280,28 @@ class SocketIOClient {
} }
for handler in self.handlers { for handler in self.handlers {
if handler.event == event { if handler.event == event {
dispatch_async(dispatch_get_main_queue()) { if data is NSArray {
if data is NSArray { if ack != nil {
if ack != nil { handler.executeCallback(data as? NSArray, withAck: ack!,
handler.executeCallback(data as? NSArray, withAck: ack!, withAckType: ackType, withSocket: self)
withAckType: ackType, withSocket: self)
} else {
handler.executeCallback(data as? NSArray)
}
} else { } else {
handler.executeCallback(data as? NSArray)
// Trying to do a ternary expression in the executeCallback method }
// seemed to crash Swift } else {
var dataArr:NSArray? = nil
// Trying to do a ternary expression in the executeCallback method
if let data:AnyObject = data { // seemed to crash Swift
dataArr = [data] var dataArr:NSArray? = nil
}
if let data:AnyObject = data {
if ack != nil { dataArr = [data]
handler.executeCallback(dataArr, withAck: ack!, }
withAckType: ackType, withSocket: self)
} else { if ack != nil {
handler.executeCallback(dataArr) handler.executeCallback(dataArr, withAck: ack!,
} withAckType: ackType, withSocket: self)
} else {
handler.executeCallback(dataArr)
} }
} }
} }