2011-05-22 69 views
0

我有以下塊在後臺執行請求。
如何在完成之前取消此請求?取消GCD塊在線程中工作

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(queue, ^{ 
     NSData *thumbnailData = [NSURLConnection sendSynchronousRequest:request]; 
     ... 
    }); 
+0

就像首選項 - 我使用NSInvocation和隊列來處理單獨的線程,但是,是的,你需要做異步請求不同步。 – theiOSDude 2011-05-22 20:46:04

回答

4

你不能。您必須使用NSURLConnection的異步接口才能取消請求。

+0

謝謝 - 如果是NSOperation呢?這會改變什麼嗎? – Egil 2011-05-22 20:19:17

+1

不,該方法被稱爲_synchronous_有一個原因:它阻塞調用線程,直到它完成。使用NSOperation,GCD或NSThread無關緊要。爲了能夠取消請求,你必須實現'NSURLConnection'的委託方法,比如'connection:didReceiveData:'等(參見文檔)。然後你可以在加載所有數據之前使用'cancel'方法。 – omz 2011-05-22 20:28:36

9

,一旦你已經出動,您不能取消...

您可以使用一種變通方法,如:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
__block BOOL isCanceled = NO; 
dispatch_async(queue, ^{ 

    if (isCanceled) 
     return; 

    NSData *thumbnailData = [NSURLConnection sendSynchronousRequest:request]; 
    ... 
}); 
+0

但你在哪裏設置isCancelled = YES? – roocell 2012-11-21 14:58:50

+0

我相信這個線程回答我的問題http://stackoverflow.com/questions/10066897/objective-c-cancel-a-dispatch-queue-using-ui-event – roocell 2012-11-21 15:01:23

5

可以使用更高級別的「NSOperationQueue」,之後加入操作排隊,那麼你可以取消所有的操作。