Задача NSURLSession для HTTP-данных (NSURLSessionDataTask) выполняется в фоновом потоке или нам нужно предоставить очередь?

Я начал использовать NSURLSession, избегая NSURLConnection теперь дней, поскольку это новый и элегантный API, предоставляемый Apple. Раньше я использовал вызов NSURLRequest в GCD, чтобы выполнить его в фоновом режиме. Вот как я раньше делал:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSURLRequest *request = [NSURLRequest requestWithURL:
                             [NSURL URLWithString:@"www.stackoverflow.com"]];
    NSURLResponse *response;
    NSError *error;
    NSData *data = [NSURLConnection sendSynchronousRequest:request 
                                         returningResponse:&response 
                                                     error:&error];
    if (error) {
        // handle error
        return;
    }
    dispatch_async(dispatch_get_main_queue(), ^{
        // do something with the data
    });
});

Теперь, вот как я использую NSURLSession:

- (void)viewDidLoad 
{
    [super viewDidLoad];

    /*-----------------*
        NSURLSession
     *-----------------*/

    NSURLSession *session = [NSURLSession sharedSession];

    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:
                                  [NSURL URLWithString:@"https://itunes.apple.com/search?term=apple&media=software"] 
                                     completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
{
    NSDictionary *json = [NSJSONSerialization 
                          JSONObjectWithData:data options:0 error:nil];
    NSLog(@"%@", json);
}];
}

Я хочу знать, что мой запрос будет выполнен в фоновом потоке или мне придется предоставить свой собственный механизм так же, как в случае NSURLRequest?

Поделитесь своими знаниями. Спасибо в Advance!!!

Ответ 1

Нет, вам не нужно использовать GCD, чтобы отправить это в фоновый режим. Фактически, поскольку блок завершения работает в фоновом потоке, имеет место точная противоположность, что если вам нужно что-либо в этом блоке для запуска в основной очереди (например, синхронизированные обновления для объектов модели, обновлений пользовательского интерфейса и т.д.), У вас есть вручную отправить это в основную очередь самостоятельно. Например, представьте себе, что вы собираетесь получить список результатов и обновить пользовательский интерфейс, чтобы отразить это, вы можете увидеть что-то вроде:

- (void)viewDidLoad 
{
    [super viewDidLoad];

    NSURLSession *session = [NSURLSession sharedSession];

    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/search?term=apple&media=software"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        // this runs on background thread

        NSError *error;
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

        // detect and handle errors here

        // otherwise proceed with updating model and UI

        dispatch_async(dispatch_get_main_queue(), ^{
            self.searchResults = json[@"results"];    // update model objects on main thread
            [self.tableView reloadData];              // also update UI on main thread
        });

        NSLog(@"%@", json);
    }];

    [dataTask resume];
}