Skip to content

Commit ae28a02

Browse files
committed
Use a ephemeral NSURLSession for polling, because NSURLConnection.sendAsnc.. seems to either leak memory, or cache
1 parent 41c168a commit ae28a02

File tree

2 files changed

+16
-17
lines changed

2 files changed

+16
-17
lines changed

SwiftIO/SocketEngine.swift

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
6161
private var _polling = true
6262
private var probing = false
6363
private var probeWait = PollWaitQueue()
64+
private let session:NSURLSession!
6465
private var waitingForPoll = false
6566
private var waitingForPost = false
6667
private var _websocket = false
@@ -81,6 +82,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
8182
init(client:SocketIOClient, forcePolling:Bool = false) {
8283
self.client = client
8384
self.forcePolling = forcePolling
85+
self.session = NSURLSession(configuration: NSURLSessionConfiguration.ephemeralSessionConfiguration(),
86+
delegate: nil, delegateQueue: self.workQueue)
8487
}
8588

8689
func close() {
@@ -144,12 +147,10 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
144147
return
145148
}
146149

147-
let req = NSURLRequest(URL:
148-
NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
150+
let req = NSURLRequest(URL: NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
149151
self.waitingForPoll = true
150152

151-
NSURLConnection.sendAsynchronousRequest(req,
152-
queue: self.workQueue) {[weak self] res, data, err in
153+
self.session.dataTaskWithRequest(req) {[weak self] data, res, err in
153154
if self == nil {
154155
return
155156
} else if err != nil {
@@ -161,7 +162,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
161162

162163
// println(data)
163164

164-
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) {
165+
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String {
165166
// println(str)
166167

167168
dispatch_async(self?.parseQueue) {[weak self] in
@@ -172,7 +173,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
172173

173174
self?.waitingForPoll = false
174175
self?.doPoll()
175-
}
176+
}.resume()
176177
}
177178

178179
private func flushProbeWait() {
@@ -206,10 +207,9 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
206207
postStr += "\(len):\(packet)"
207208
}
208209

209-
self.postWait.removeAll(keepCapacity: true)
210+
self.postWait.removeAll(keepCapacity: false)
210211

211-
var req = NSMutableURLRequest(URL:
212-
NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
212+
let req = NSMutableURLRequest(URL: NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
213213

214214
req.HTTPMethod = "POST"
215215
req.setValue("application/html-text", forHTTPHeaderField: "Content-Type")
@@ -222,7 +222,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
222222
req.HTTPBody = postData
223223

224224
self.waitingForPost = true
225-
NSURLConnection.sendAsynchronousRequest(req, queue: self.workQueue) {[weak self] res, data, err in
225+
226+
self.session.dataTaskWithRequest(req) {[weak self] data, res, err in
226227
if err != nil {
227228
if self!.polling {
228229
self?.handlePollingFailed(err)
@@ -233,7 +234,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
233234
self?.flushWaitingForPost()
234235
self?.waitingForPost = false
235236
self?.doPoll()
236-
}
237+
}.resume()
237238
}
238239

239240
// We had packets waiting for send when we upgraded
@@ -269,8 +270,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
269270
self.urlWebSocket = urlWebSocket
270271
let reqPolling = NSURLRequest(URL: NSURL(string: urlPolling + "&b64=1")!)
271272

272-
NSURLConnection.sendAsynchronousRequest(reqPolling,
273-
queue: self.workQueue) {[weak self] res, data, err in
273+
self.session.dataTaskWithRequest(reqPolling) {[weak self] data, res, err in
274274
var err:NSError?
275275
if self == nil {
276276
return
@@ -325,7 +325,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
325325
self?.doPoll()
326326
self?.startPingTimer()
327327
}
328-
}
328+
}.resume()
329329
}
330330

331331
// Translatation of engine.io-parser#decodePayload
@@ -477,8 +477,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
477477
}
478478

479479
func sendPing() {
480-
// println("sending ping")
481-
482480
if self.websocket {
483481
self.sendWebSocketMessage("", withType: PacketType.PING)
484482
} else {
@@ -527,7 +525,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
527525
if self.pingInterval == nil {
528526
return
529527
}
530-
528+
531529
self.pingTimer?.invalidate()
532530
dispatch_async(dispatch_get_main_queue()) {
533531
self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(self.pingInterval!), target: self,

SwiftIO/SocketEventHandler.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
// THE SOFTWARE.
2424

2525
typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
26+
typealias AnyHandler = (event:String, items:AnyObject?)
2627
typealias AckEmitter = (AnyObject...) -> Void
2728

2829
private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) -> AckEmitter {

0 commit comments

Comments
 (0)