在dispatch_async中调度dispatch_get_main_queue

时间:2015-02-14 23:22:21

标签: ios objective-c

在我的VC1中,我运行了从在线博客中获取的代码:

dispatch_async(dispatch_get_main_queue(), ^{
   NSURLSessionDataTask* dataTask = 
    [session dataTaskWithRequest:request 
    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
       [self.delegate didReceiveResponse:response data:data error:error];
    }];
    [dataTask resume];
});

我的问题是:

  • 此代码的哪一部分将在主线程中运行,哪部分将在后台或非主线程中运行?
  • 我希望didReceiveResponse在主线程中运行以更新UI。
  • 其他所有内容都应该在后台运行。

  • 一点点解释都很有用。

1 个答案:

答案 0 :(得分:0)

你的代码全部由内而外。您需要创建后台队列来运行任务,并指定应在主队列上运行完成处理程序:

session = [NSURLSession sessionWithConfiguration:someConfiguration delegate:someDelegate delegateQueue:[NSOperation mainQueue]];

...

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   NSURLSessionDataTask* dataTask = 
    [session dataTaskWithRequest:request 
    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
       [self.delegate didReceiveResponse:response data:data error:error];
    }];
    [dataTask resume];
});

上面的代码设置了会话,因此在主队列上调用完成处理程序,然后在后台创建并恢复数据任务。

如上所述,您指定要创建数据任务并在主队列上启动,并且您没有指示完成处理程序的运行位置。