gpt4 book ai didi

ios - 取消 NSOperation 并立即将其从队列中移除

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:31:09 25 4
gpt4 key购买 nike

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

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

In OS X v10.6 and later, canceling an operation causes the operation to ignore any dependencies it may have. This behavior makes it possible for the queue to execute the operation’s start method as soon as possible. The start method, in turn, moves the operation to the finished state so that it can be removed from the queue.

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

假设我在队列中有 20 个 NSOperation,我刚刚取消了第 18 个,它将保留在 NSOperationQueue 中,直到它可以运行并表示它已完成(我的 NSOperation 正确检查 isCancelled) 但因为它留在队列中,所以它也留在 UITableView 中,我将 dataSource 设置为类似于 myOperationQueue.operations

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

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

编辑:我还尝试在 cancel 中覆盖 isFinished:

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

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

最佳答案

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

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

关于ios - 取消 NSOperation 并立即将其从队列中移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14417921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com