3

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コードを削除すると、再び機能します。

誰もこれをやろうとしたことがありますか?これは機能するはずですか?または、作業がどこのキューにディスパッチされたかを誤解していますか?

4

1 に答える 1