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]
.
我知道 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]
.