NSURLSession происходит в отдельном потоке?
Я разрабатывал приложение, которое использует NSURLSession, и думал о том, чтобы поместить его в другой поток с помощью Grand Central Dispatch, но если NSURLSession автоматически сделает это в фоновом режиме, тогда мне не придется использовать GCD, правильно?
Другими словами, NSURLSession автоматически использует Grand Central Dispatch в фоновом режиме, так что нам не о чем беспокоиться?
2 ответа
Да,
NSURLSession делает свою работу в фоновом потоке. Загрузка ВСЕГДА происходит в фоновом потоке.
РЕДАКТИРОВАТЬ:
Там нет причин, чтобы обернуть ваш код, который вызывает NSURLSession
(или же URLSession
в Swift 3/Swift 4) в вызове GCD.
Вы можете контролировать, выполняются ли его методы завершения в фоновом потоке или нет с помощью очереди, которую вы передаете в параметре DelegateQueue методу init. Если вы передадите nil, он создаст очередь последовательных операций (фоновый поток), где будут вызываться ваши методы завершения. Если вы проходите в NSOperationQueue.mainQueue()
тогда ваши методы делегирования завершения будут вызваны в главном потоке, и вам не нужно будет оборачивать вызовы пользовательского интерфейса в dispatch_async()
звонки в главную ветку.
Вот пример запроса NSURLSession:
[[session dataTaskWithURL:[NSURL URLWithString:someURL]
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
// handle response
}] resume];
Из документации: "Этот метод предназначен в качестве альтернативы sendAsynchronousRequest:queue: завершению Handler: метод NSURLConnection, с добавленной возможностью поддержки пользовательской аутентификации и отмены". Краткий ответ: да, NSURLSession будет выполнять фоновые операции. Вам не нужно беспокоиться об этой блокировке вашего интерфейса.