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 будет выполнять фоновые операции. Вам не нужно беспокоиться об этой блокировке вашего интерфейса.

Другие вопросы по тегам