我使用NSOperation执行两项操作。第一个操作是从Internet加载数据,而第二个操作是更新UI。
但是,如果viewDidDisappear函数是由用户触发的,我该如何停止数据加载过程? 我试过了
[taskQueue cancellAllOperations],
但是此函数仅将内部的每个操作都标记为已取消,而不是逐字取消执行过程。
有人可以提出一些建议吗?在此先感谢。
答案 0 :(得分:0)
AFAIK,没有直接的方法来取消已经执行的NSOperation
。但你可以像你一样取消taskQueue
。
[taskQueue cancellAllOperations];
在操作块内,定期(在逻辑原子代码块之间)检查isCancelled
以决定是否继续进行。
NSBlockOperation *loadOp = [[NSBlockOperation alloc]init];
__weak NSBlockOperation *weakRefToLoadOp = loadOp;
[loadOp addExecutionBlock:^{
if (!weakRefToLoadOp.cancelled) {
// some atomic block of code 1
}
if (!weakRefToLoadOp.cancelled) {
// some atomic block of code 2
}
if (!weakRefToLoadOp.cancelled) {
// some atomic block of code 3
}
}];
NSOperation
的块应该仔细划分为子块,这样可以安全地停止块的其余部分的执行。如果需要,您还应该回滚到目前为止执行的子块的效果。
if (!weakRefToLoadOp.cancelled) {
// nth sub-block
}
else {
//handle the effects of so-far-executed (n-1) sub-blocks
}
答案 1 :(得分:0)
真诚地感谢您的回答。但我发现实际上
[self performSelectorInBackground:@selector(httpRetrieve) withObject:nil];
解决我的问题。这个过程不必取消。感觉就像NSOpertaions没有在后台运行。因此,当nsoperation仍在运行时,回到超级导航视图,UI将被卡住!