NSOperation maxConcurrentOperationCount = 1 仍然允许子类的多个操作
NSOperation maxConcurrentOperationCount = 1 still allowing multiple operations of subclass
我已经子classed NSOperation(现在称为 Operation)以在后台执行一些异步查询。我希望一次执行一个。为此,我将 maxConcurrentOperationCount 设置为 1,但它仍然允许队列中有多个对象。
我已经在 class 声明下方声明了我的队列:
let downloadQueue = OperationQueue()
然后在视图中加载设置了计数:
downloadQueue.maxConcurrentOperationCount = 1
然后在代码中调用Operation subclass:
self.downloadQueue.addOperation(DownloadOperation(col: collectionView, index: indexPath, cell: cell))
还有我的子class:
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 完成?查询本身有一个完成块,但我不知道如何在这种情况下使用它。
如果到达 main
函数的末尾,则操作队列认为操作已完成,而不管您的操作可能在另一个队列中启动了哪些其他处理。所以就操作队列而言,按要求一次只运行一个操作
解决方案是确保您的自定义操作 main
不会 return 直到它启动的任何异步进程完全完成。一种常见的方法是使用调度组或信号量。这些解决方案存在很多现有问题。
我已经子classed NSOperation(现在称为 Operation)以在后台执行一些异步查询。我希望一次执行一个。为此,我将 maxConcurrentOperationCount 设置为 1,但它仍然允许队列中有多个对象。
我已经在 class 声明下方声明了我的队列:
let downloadQueue = OperationQueue()
然后在视图中加载设置了计数:
downloadQueue.maxConcurrentOperationCount = 1
然后在代码中调用Operation subclass:
self.downloadQueue.addOperation(DownloadOperation(col: collectionView, index: indexPath, cell: cell))
还有我的子class:
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 完成?查询本身有一个完成块,但我不知道如何在这种情况下使用它。
如果到达 main
函数的末尾,则操作队列认为操作已完成,而不管您的操作可能在另一个队列中启动了哪些其他处理。所以就操作队列而言,按要求一次只运行一个操作
解决方案是确保您的自定义操作 main
不会 return 直到它启动的任何异步进程完全完成。一种常见的方法是使用调度组或信号量。这些解决方案存在很多现有问题。