取消NSOperation并立即将其从队列中删除

Its*_*ret 2 objective-c uitableview nsoperation nsoperationqueue ios

所以我已经考虑了几天了,我似乎无法找到一个好的方法来使它工作.

我有一个NSOperationQueue只允许一次一个操作.我从文档中了解到:

在OS X v10.6及更高版本中,取消操作会导致操作忽略它可能具有的任何依赖性.此行为使队列可以尽快执行操作的start方法.反过来,start方法将操作移动到完成状态,以便可以从队列中删除它.

当我发送取消时它将设置isCancelled为YES,但我的问题是:

假设我有20个NSOperation队列而且我刚刚取消了18号,它将一直保持NSOperationQueue到它可以运行并说它已经完成(我的NSOperation检查正确isCancelled)但是因为它保留在队列中它也保留在UITableView我设置dataSource的东西中喜欢myOperationQueue.operations.

这就是困扰我的用户,用户将点击Cancel将调用该cancel方法,NSOperation但操作仍会显示,因为它仍然在队列中.

我考虑过startcancel方法中调用,但不允许只有队列才可以start.

编辑:我也试着重写isFinishedcancel:

[self willChangeValueForKey:@"isFinished"];
_isFinished = YES;
[self didChangeValueForKey:@"isFinished"];
Run Code Online (Sandbox Code Playgroud)

它工作但它也发送startNSOperation队列中的下一个,它可以导致同时有2个NSOperation,我只想要一个.

Pau*_*nde 5

因此,如果我理解正确,未完成的操作列表是UITableView的数据源.

一种解决方案是过滤操作列表以删除已取消的操作.表视图的数据源将是此筛选列表,而不是原始操作列表.

  • @Clarisse:这不应该只是一线改变.不要从`[myQueue operations]`填充表,而是使用`[[myQueue operations] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"isCancelled == NO"]]` (2认同)