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

时间:2013-01-19 19:19:30

标签: ios objective-c uitableview nsoperation nsoperationqueue

所以我几天都在考虑这个问题,而且我似乎找不到一个好办法让它发挥作用。

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

  

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

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

说我队列中有20个NSOperation,我刚刚取消了第18个,它会留在NSOperationQueue直到它可以运行并说它已经完成(我的{{ 1}}正确检查NSOperation)但是当它保留在队列中时,它也会保留在isCancelled中,我将UITableView设置为dataSource

令我困扰的是,用户会点击myOperationQueue.operationsCancel会调用cancel上的NSOperation方法,但操作仍会显示为“{1}}。仍然在队列中。

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

编辑:我还试图覆盖isFinished

中的cancel
[self willChangeValueForKey:@"isFinished"];
_isFinished = YES;
[self didChangeValueForKey:@"isFinished"];

虽然有效,但它也会将start发送到队列中的下一个NSOperation,并且可能会导致同时拥有2个NSOperation而我只需要一个{{1}}。

1 个答案:

答案 0 :(得分:5)

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

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