我已经实现了一个使用GCD异步调度的块,如下所示:
__block BOOL retValue;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
retValue = [self GCDHandler:actionName WithServiceType:serviceType :arguments];
});
return retValue;
如果运行的时间超过我想要的时间,如何取消这样的阻止?有没有办法取消GCD调度的块,或者为它们提供超时?
答案 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之上的,抽象层可能更适合你要做的事情(你没有声明 - 它是网络请求吗?等等)。