Use a ephemeral NSURLSession for polling, because NSURLConnection.sendAsnc.. seems to either leak memory, or cache
This commit is contained in:
parent
41c168a29a
commit
ae28a02163
@ -61,6 +61,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
private var _polling = true
|
private var _polling = true
|
||||||
private var probing = false
|
private var probing = false
|
||||||
private var probeWait = PollWaitQueue()
|
private var probeWait = PollWaitQueue()
|
||||||
|
private let session:NSURLSession!
|
||||||
private var waitingForPoll = false
|
private var waitingForPoll = false
|
||||||
private var waitingForPost = false
|
private var waitingForPost = false
|
||||||
private var _websocket = false
|
private var _websocket = false
|
||||||
@ -81,6 +82,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
init(client:SocketIOClient, forcePolling:Bool = false) {
|
init(client:SocketIOClient, forcePolling:Bool = false) {
|
||||||
self.client = client
|
self.client = client
|
||||||
self.forcePolling = forcePolling
|
self.forcePolling = forcePolling
|
||||||
|
self.session = NSURLSession(configuration: NSURLSessionConfiguration.ephemeralSessionConfiguration(),
|
||||||
|
delegate: nil, delegateQueue: self.workQueue)
|
||||||
}
|
}
|
||||||
|
|
||||||
func close() {
|
func close() {
|
||||||
@ -144,12 +147,10 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let req = NSURLRequest(URL:
|
let req = NSURLRequest(URL: NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
|
||||||
NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
|
|
||||||
self.waitingForPoll = true
|
self.waitingForPoll = true
|
||||||
|
|
||||||
NSURLConnection.sendAsynchronousRequest(req,
|
self.session.dataTaskWithRequest(req) {[weak self] data, res, err in
|
||||||
queue: self.workQueue) {[weak self] res, data, err in
|
|
||||||
if self == nil {
|
if self == nil {
|
||||||
return
|
return
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
@ -161,7 +162,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
|
|
||||||
// println(data)
|
// println(data)
|
||||||
|
|
||||||
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) {
|
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String {
|
||||||
// println(str)
|
// println(str)
|
||||||
|
|
||||||
dispatch_async(self?.parseQueue) {[weak self] in
|
dispatch_async(self?.parseQueue) {[weak self] in
|
||||||
@ -172,7 +173,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
|
|
||||||
self?.waitingForPoll = false
|
self?.waitingForPoll = false
|
||||||
self?.doPoll()
|
self?.doPoll()
|
||||||
}
|
}.resume()
|
||||||
}
|
}
|
||||||
|
|
||||||
private func flushProbeWait() {
|
private func flushProbeWait() {
|
||||||
@ -206,10 +207,9 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
postStr += "\(len):\(packet)"
|
postStr += "\(len):\(packet)"
|
||||||
}
|
}
|
||||||
|
|
||||||
self.postWait.removeAll(keepCapacity: true)
|
self.postWait.removeAll(keepCapacity: false)
|
||||||
|
|
||||||
var req = NSMutableURLRequest(URL:
|
let req = NSMutableURLRequest(URL: NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
|
||||||
NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
|
|
||||||
|
|
||||||
req.HTTPMethod = "POST"
|
req.HTTPMethod = "POST"
|
||||||
req.setValue("application/html-text", forHTTPHeaderField: "Content-Type")
|
req.setValue("application/html-text", forHTTPHeaderField: "Content-Type")
|
||||||
@ -222,7 +222,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
req.HTTPBody = postData
|
req.HTTPBody = postData
|
||||||
|
|
||||||
self.waitingForPost = true
|
self.waitingForPost = true
|
||||||
NSURLConnection.sendAsynchronousRequest(req, queue: self.workQueue) {[weak self] res, data, err in
|
|
||||||
|
self.session.dataTaskWithRequest(req) {[weak self] data, res, err in
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if self!.polling {
|
if self!.polling {
|
||||||
self?.handlePollingFailed(err)
|
self?.handlePollingFailed(err)
|
||||||
@ -233,7 +234,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
self?.flushWaitingForPost()
|
self?.flushWaitingForPost()
|
||||||
self?.waitingForPost = false
|
self?.waitingForPost = false
|
||||||
self?.doPoll()
|
self?.doPoll()
|
||||||
}
|
}.resume()
|
||||||
}
|
}
|
||||||
|
|
||||||
// We had packets waiting for send when we upgraded
|
// We had packets waiting for send when we upgraded
|
||||||
@ -269,8 +270,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
self.urlWebSocket = urlWebSocket
|
self.urlWebSocket = urlWebSocket
|
||||||
let reqPolling = NSURLRequest(URL: NSURL(string: urlPolling + "&b64=1")!)
|
let reqPolling = NSURLRequest(URL: NSURL(string: urlPolling + "&b64=1")!)
|
||||||
|
|
||||||
NSURLConnection.sendAsynchronousRequest(reqPolling,
|
self.session.dataTaskWithRequest(reqPolling) {[weak self] data, res, err in
|
||||||
queue: self.workQueue) {[weak self] res, data, err in
|
|
||||||
var err:NSError?
|
var err:NSError?
|
||||||
if self == nil {
|
if self == nil {
|
||||||
return
|
return
|
||||||
@ -325,7 +325,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
self?.doPoll()
|
self?.doPoll()
|
||||||
self?.startPingTimer()
|
self?.startPingTimer()
|
||||||
}
|
}
|
||||||
}
|
}.resume()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translatation of engine.io-parser#decodePayload
|
// Translatation of engine.io-parser#decodePayload
|
||||||
@ -477,8 +477,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func sendPing() {
|
func sendPing() {
|
||||||
// println("sending ping")
|
|
||||||
|
|
||||||
if self.websocket {
|
if self.websocket {
|
||||||
self.sendWebSocketMessage("", withType: PacketType.PING)
|
self.sendWebSocketMessage("", withType: PacketType.PING)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -23,6 +23,7 @@
|
|||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
|
|
||||||
typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
|
typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
|
||||||
|
typealias AnyHandler = (event:String, items:AnyObject?)
|
||||||
typealias AckEmitter = (AnyObject...) -> Void
|
typealias AckEmitter = (AnyObject...) -> Void
|
||||||
|
|
||||||
private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) -> AckEmitter {
|
private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) -> AckEmitter {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user