Длинный опрос HTTP в Swift
Я пытаюсь реализовать решение для длительного опроса в Swift, используя iOS 8+.
Хотя решение, несомненно, работает и оставляет основной поток свободным для взаимодействия с пользовательским интерфейсом, использование памяти постоянно растет, поэтому я, очевидно, что-то делаю не так. Класс, который я написал, выглядит следующим образом:
enum LongPollError:ErrorType{
case IncorrectlyFormattedUrl
case HttpError
}
public class LongPollingRequest: NSObject {
var GlobalUserInitiatedQueue: dispatch_queue_t {
return dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)
}
var GlobalBackgroundQueue: dispatch_queue_t {
return dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.rawValue), 0)
}
var longPollDelegate: LongPollingDelegate
var request: NSURLRequest?
init(delegate:LongPollingDelegate){
longPollDelegate = delegate
}
public func poll(endpointUrl:String) throws -> Void{
let url = NSURL(string: endpointUrl)
if(url == nil){
throw LongPollError.IncorrectlyFormattedUrl
}
request = NSURLRequest(URL: url!)
poll()
}
private func poll(){
dispatch_async(GlobalBackgroundQueue) {
self.longPoll()
}
}
private func longPoll() -> Void{
autoreleasepool{
do{
let urlSession = NSURLSession.sharedSession()
let dataTask = urlSession.dataTaskWithRequest(self.request!, completionHandler: {
(data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
if( error == nil ) {
self.longPollDelegate.dataReceived(data)
self.poll()
} else {
self.longPollDelegate.errorReceived()
}
})
dataTask.resume()
}
}
}
}
Я попытался профилировать приложение в инструментах, но результаты сбивают с толку. Я надеюсь, что кто-то может указать мне правильное направление.
Спасибо
1 ответ
Решение
LongPollDelegate является сильным, поэтому у вас есть цикл сохранения. Сделайте это слабой переменной.