我已经将NSOperation(现在称为Operation)子类化为在后台执行一些异步查询。我希望这些可以一次执行一个。为此,我已将maxConcurrentOperationCount设置为1,但它仍允许队列中的多个对象。
我已将我的队列声明在类声明的正下方:
let downloadQueue = OperationQueue()
然后在视图中加载设置计数:
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的完成?查询本身有一个完成块,但我不知道如何在这种情况下使用它。
答案 0 :(得分:1)
如果到达main
函数的末尾,则操作队列认为操作已完成,无论您的操作在另一个队列中启动了什么其他处理。因此,就操作队列而言,它只是按要求一次运行一个操作。
解决方案是确保自定义操作main
不会返回,直到它启动的异步过程完全完成。常见的方法是使用调度组或信号量。现有很多问题都涉及这些解决方案。