您可以使用NSOperationQueue
取消所有挂起的操作,但它仍然不会取消现有的操作。您仍然需要执行一些操作来取消现有操作......这也可以提前中止队列中的操作。
我通常更喜欢直接 GCD,除非在我的用例中有其他更适合NSOperationQueue
.
此外,如果您的加载具有外部取消机制,您希望取消任何挂起的 I/O 操作。
如果操作是独立的,请考虑并发队列,因为它将允许较新的请求在其他请求被取消时同时执行。
此外,如果它们都是 I/O,请考虑是否可以使用dispatch_io
而不是阻塞线程。正如蒙克所说,“你以后会感谢我的。”
考虑这样的事情:
- (void)userRequestedNewSearch:(SearchInfo*)searchInfo {
// Assign this operation a new token, that uniquely identifies this operation.
uint32_t token = [self nextOperationToken];
// If your "loading" API has an external abort mechanism, you want to keep
// track of the in-flight I/O so any existing I/O operations can be canceled
// before dispatching new work.
dispatch_async(myQueue, ^{
// Try to load your data in small pieces, so you can exit as early as
// possible. If you have to do a monolithic load, that's OK, but this
// block will not exit until that stops.
while (! loadIsComplete) {
if ([self currentToken] != token) return;
// Load some data, set loadIsComplete when loading completes
}
dispatch_async(dispatch_get_main_queue(), ^{
// One last check before updating the UI...
if ([self currentToken] != token) return;
// Do your UI update operations
});
});
}
它将提前中止任何不是最后提交的操作。如果您使用过NSOperationQueue
,您可以调用cancelAllOperations
,但您仍然需要一种类似的机制来提前中止当前正在执行的机制。