如何在GCD中杀死/挂起/关闭异步块?

时间:2012-02-15 13:16:06

标签: iphone objective-c ios grand-central-dispatch

我已经实现了一个使用GCD异步调度的块,如下所示:

__block BOOL retValue;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    retValue = [self GCDHandler:actionName WithServiceType:serviceType :arguments];
});

return retValue;

如果运行的时间超过我想要的时间,如何取消这样的阻止?有没有办法取消GCD调度的块,或者为它们提供超时?

2 个答案:

答案 0 :(得分:3)

没有内置的方法来取消GCD块。他们相当沉寂和忘记。我过去做过这种方式的一种方法是为块提供“令牌”。

- (NSString*)dispatchCancelable:(dispatch_block_t)block
{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        if (!checkIfCanceled)
            block();
    }
    return blah; //Create a UUID or something
}

- (void)cancelBlock:(NSString*)token
{
   //Flag something to mark as canceled
}

答案 1 :(得分:0)

这取决于你的GCDHandler在做什么。在Apple开发网站上有一些关于GCD的非常好的视频 - 您可能想要向上移动一层(进入Cocoa)并使用NSOperationQueue和NSOperations(您自己的子类或NSBlockOperation)。它们都是建立在GCD之上的,抽象层可能更适合你要做的事情(你没有声明 - 它是网络请求吗?等等)。