如何杀死/暂停/closuresGCD中的asynchronous块?
我已经实现了一个使用GCDasynchronous调度的块,如下所示:
__block BOOL retValue; dispatch_async(dispatch_get_global_queue(0, 0), ^{ retValue = [self GCDHandler:actionName WithServiceType:serviceType :arguments]; }); return retValue;
如果运行时间比我想要的长,我该如何取消这样的模块? 有没有办法取消GCD调度的块,或提供超时?
没有build立取消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 }
这取决于你的GCDHandler在做什么。 在苹果开发网站上有一些关于GCD的相当不错的video – 你可能想要移动一层(进入Cocoa)并使用NSOperationQueue和NSOperations(你自己的子类或者NSBlockOperation)。 它们都build立在GCD的基础之上,抽象层可能更适合你正在做的事情(你没有说明 – 是networking请求吗?等等)