Я использую iOS 7 NSURLSession, чтобы сделать простой GET для службы RESTful. Вот что я сделал:
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];
Весь приведенный выше код работает нормально. завершенияHandler должен вызываться в основной очереди.
Однако, если я использую это в 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(), который должен быть таким же, как [NSOperationQueue mainQueue], как указано в сеансе delegateQueue?? Tt должен эффективно работать в основном потоке, как и первый набор кода. Однако я обнаружил, что завершениеHandler никогда не вызывается. И если я уберу код GCD, он снова заработает.
Кто-нибудь пытался сделать это раньше? Должно ли это работать? или я неправильно понимаю, где работа была отправлена в какую очередь?
for (int i = 0; i < 10000000; i++) ;
? - person Lithu T.V   schedule 16.01.2014