3

所以这几天我一直在思考这个问题,我似乎找不到一个好的方法来让它工作。

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

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

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

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

这就是困扰我的地方,用户将单击Cancel哪个将调用该cancel方法,NSOperation但该操作仍将显示,因为它仍在队列中。

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

编辑:我也试图isFinished覆盖cancel

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

它可以工作,但它也会发送start到队列中的下一个NSOperation,它可能导致同时拥有 2 个NSOperation,而我只想要一个。

4

1 回答 1

5

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

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

于 2013-01-19T19:32:08.173 回答