Ответ 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];
}