dispatch_async 处理事件

dispatch_async handle event

我知道 dispatch_async 可以处理线程。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    // handle things that takes a long time
    dispatch_async(dispatch_get_main_queue(), ^{  
        // update UI 
    });  
}); 

但是我怎样才能取消它呢?

例如:

我有两个视图控制器——AViewController 和 BViewController,A->present B,和一个关闭 B 的按钮。

我会在 BViewController 中做 myMethod,事情是我想在执行 myMethod 时关闭 B,所以我使用 dispatch_async,它确实从 B 关闭到 A。但是回到 AViewController 后,音频就来了。

如何在关闭方法 exec 后立即停止 myMethod

- (void)myMethod {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
        // handles thing A
        // play a audio
        dispatch_async(dispatch_get_main_queue(), ^{  
            // update UI 
        });  
    }); 
}

你需要的不是 GCD 和 dispatch_async,而是 NSOperation。它是 GCD 的高级包装器,允许您引用异步操作、检查它们的状态、取消它们等。

我建议使用名为 NSBlockOperation 的非常方便的子class。您应该在 class 中保留对您的操作的引用,如果您需要取消它,只需调用 [self.myOperation cancel].