Fix use-after-release issue in WebSocket
This commit is contained in:
parent
80cfe8c534
commit
44508a5193
@ -133,15 +133,18 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
if isCreated {
|
||||
return
|
||||
}
|
||||
unowned let weakSelf = self
|
||||
|
||||
dispatch_async(queue,{
|
||||
weakSelf.didDisconnect = false
|
||||
|
||||
dispatch_async(queue, { [weak self] in
|
||||
if let weakSelf = self {
|
||||
weakSelf.didDisconnect = false
|
||||
}
|
||||
})
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), {
|
||||
weakSelf.isCreated = true
|
||||
weakSelf.createHTTPRequest()
|
||||
weakSelf.isCreated = false
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { [weak self] in
|
||||
if let weakSelf = self {
|
||||
weakSelf.isCreated = true
|
||||
weakSelf.createHTTPRequest()
|
||||
weakSelf.isCreated = false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@ -370,14 +373,15 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
}
|
||||
}
|
||||
if totalSize > 0 {
|
||||
unowned let weakSelf = self
|
||||
if validateResponse(buffer, bufferLen: totalSize) {
|
||||
dispatch_async(queue,{
|
||||
weakSelf.connected = true
|
||||
if let connectBlock = weakSelf.onConnect {
|
||||
connectBlock()
|
||||
dispatch_async(queue, { [weak self] in
|
||||
if let weakSelf = self {
|
||||
weakSelf.connected = true
|
||||
if let connectBlock = weakSelf.onConnect {
|
||||
connectBlock()
|
||||
}
|
||||
weakSelf.delegate?.websocketDidConnect(weakSelf)
|
||||
}
|
||||
weakSelf.delegate?.websocketDidConnect(self)
|
||||
})
|
||||
totalSize += 1 //skip the last \n
|
||||
let restSize = bufferLen - totalSize
|
||||
@ -515,11 +519,13 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
data = NSData(bytes: UnsafePointer<UInt8>((buffer+offset)), length: Int(len))
|
||||
}
|
||||
if receivedOpcode == OpCode.Pong.rawValue {
|
||||
dispatch_async(queue,{[unowned self] in
|
||||
if let pongBlock = self.onPong {
|
||||
pongBlock()
|
||||
dispatch_async(queue, { [weak self] in
|
||||
if let weakSelf = self {
|
||||
if let pongBlock = weakSelf.onPong {
|
||||
pongBlock()
|
||||
}
|
||||
weakSelf.pongDelegate?.websocketDidReceivePong(weakSelf)
|
||||
}
|
||||
self.pongDelegate?.websocketDidReceivePong(self)
|
||||
})
|
||||
|
||||
let step = Int(offset+numericCast(len))
|
||||
@ -608,19 +614,23 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
writeError(CloseCode.Encoding.rawValue)
|
||||
return false
|
||||
}
|
||||
dispatch_async(queue,{[unowned self] in
|
||||
if let textBlock = self.onText {
|
||||
textBlock(str! as String)
|
||||
dispatch_async(queue, { [weak self] in
|
||||
if let weakSelf = self {
|
||||
if let textBlock = weakSelf.onText {
|
||||
textBlock(str! as String)
|
||||
}
|
||||
weakSelf.delegate?.websocketDidReceiveMessage(weakSelf, text: str! as String)
|
||||
}
|
||||
self.delegate?.websocketDidReceiveMessage(self, text: str! as String)
|
||||
})
|
||||
} else if response.code == .BinaryFrame {
|
||||
let data = response.buffer! //local copy so it is perverse for writing
|
||||
dispatch_async(queue,{[unowned self] in
|
||||
if let dataBlock = self.onData {
|
||||
dataBlock(data)
|
||||
dispatch_async(queue, { [weak self] in
|
||||
if let weakSelf = self {
|
||||
if let dataBlock = weakSelf.onData {
|
||||
dataBlock(data)
|
||||
}
|
||||
weakSelf.delegate?.websocketDidReceiveData(weakSelf, data: data)
|
||||
}
|
||||
self.delegate?.websocketDidReceiveData(self, data: data)
|
||||
})
|
||||
}
|
||||
readStack.removeLast()
|
||||
@ -723,12 +733,14 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
///used to preform the disconnect delegate
|
||||
private func doDisconnect(error: NSError?) {
|
||||
if !self.didDisconnect {
|
||||
dispatch_async(queue,{[unowned self] in
|
||||
self.didDisconnect = true
|
||||
if let disconnect = self.onDisconnect {
|
||||
disconnect(error)
|
||||
dispatch_async(queue, { [weak self] in
|
||||
if let weakSelf = self {
|
||||
weakSelf.didDisconnect = true
|
||||
if let disconnect = weakSelf.onDisconnect {
|
||||
disconnect(error)
|
||||
}
|
||||
weakSelf.delegate?.websocketDidDisconnect(weakSelf, error: error)
|
||||
}
|
||||
self.delegate?.websocketDidDisconnect(self, error: error)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user