2011-05-22 35 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”,之后加入操作排队,那么你可以取消所有的操作。