我正在使用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代码,它再次工作。
以前有人试过这样做吗?这有用吗?或者我误解了工作派往哪个队列?
答案 0 :(得分:0)
AFAIK,所有NSURLSession
回调都发生在readonly NSURLSession. delegateQueue
属性(docs)指定的队列上,可以在初始化时指定。