NSURLSessionTask completionTask永远不会使用GCD在主队列中调用

时间:2014-01-16 07:12:04

标签: ios objective-c grand-central-dispatch nsurlsession nsurlsessiontask

我正在使用iOS 7 NSURLSession对RESTful服务进行一些简单的GET。这就是我所做的:

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration ephemeralSessionConfiguration];
_session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:nil delegateQueue:[NSOperationQueue mainQueue]]; 

// create your url at this line
NSURLRequest *request = [NSURLRequest requestWithURL:url];

NSURLSessionTask *task = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
   // do something with the result 
}]; 
[task resume];

以上所有代码都运行正常。应该在主队列中调用completionHandler。

但是,如果我在GCD中使用它,就像这样:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   // do some heavylifting in the background

   for (int i = 0; i < 10000000; i++) ;

   dispatch_async(dispatch_get_main_queue(), ^{
       // do the exact same thing as the above NSURLSession call
       NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration ephemeralSessionConfiguration];
       _session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:nil delegateQueue:[NSOperationQueue mainQueue]]; 

       // create your url at this line
       NSURLRequest *request = [NSURLRequest requestWithURL:url];

       NSURLSessionTask *task = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
          // do something with the result 
       }]; 
       [task resume];
   });
});

现在,我想我在dispatch_get_main_queue()中运行该代码,该代码应该与会话的delegateQueue中指定的[NSOperationQueue mainQueue]相同? Tt应该像第一组代码一样在主线程中有效运行。但是,我发现从未调用completionHandler。如果我删除GCD代码,它再次工作。

以前有人试过这样做吗?这有用吗?或者我误解了工作派往哪个队列?

1 个答案:

答案 0 :(得分:0)

AFAIK,所有NSURLSession回调都发生在readonly NSURLSession. delegateQueue属性(docs)指定的队列上,可以在初始化时指定。