gpt4 book ai didi

swift - NSOperation maxConcurrentOperationCount = 1 仍然允许子类的多个操作

转载 作者:搜寻专家 更新时间:2023-11-01 07:16:26 24 4
gpt4 key购买 nike

我将 NSOperation(现在称为 Operation)子类化以在后台执行一些异步查询。我希望一次执行一个。为此,我将 maxConcurrentOperationCount 设置为 1,但它仍然允许队列中有多个对象。

我已经在类声明的正下方声明了我的队列:

let downloadQueue = OperationQueue()

然后在 View 中加载设置计数:

downloadQueue.maxConcurrentOperationCount = 1

然后在代码中调用Operation子类:

self.downloadQueue.addOperation(DownloadOperation(col: collectionView, index: indexPath, cell: cell))

还有我的子类:

class DownloadOperation : Operation {

var collectionView: UICollectionView
var indexPath: IndexPath
var collectionCell: InnerCollectionCell

init(col: UICollectionView, index: IndexPath, cell: InnerCollectionCell) {
collectionView = col
indexPath = index
collectionCell = cell
}

let mainQueue = OperationQueue.main

override func main() {


if(isCancelled) {
return
}

///
/// Long query that gets objects in background
/// it is itself an async task
/// there is a completion block in the query
///


}
}

如果我继续将 DownloadOperation 添加到 downloadQueue,任务将继续并发执行(异步)。这是因为我正在运行的查询本身就是一个异步任务,所以代码会向前跳过并假设操作在异步查询有机会获取所有数据之前完成吗?

如果是这种情况,我该如何等待异步查询完成以指示 NSOperation 完成?查询本身有一个完成 block ,但我不知道如何在这种情况下使用它。

最佳答案

如果到达 main 函数的末尾,则操作队列认为操作已完成,而不管您的操作可能在另一个队列中启动了哪些其他处理。所以就操作队列而言,它一次只按要求运行一个操作。

解决方案是确保您的自定义操作的 main 在它启动的任何异步进程完全完成之前不会返回。一种常见的方法是使用调度组或信号量。这些解决方案存在大量现有问题。

关于swift - NSOperation maxConcurrentOperationCount = 1 仍然允许子类的多个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41993723/

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