Ich habe NSOperation (was jetzt als Operation bekannt ist) durchgeführt, um einige asynchrone Abfragen im Hintergrund auszuführen. Ich möchte, dass diese einzeln ausgeführt werden. Zu diesem Zweck habe ich maxConcurrentOperationCount auf 1 gesetzt, aber es erlaubt immer noch mehrere Objekte in der Warteschlange.NSOperation maxConcurrentOperationCount = 1 erlaubt immer noch mehrere Operationen der Unterklasse
Ich habe meine Warteschlange direkt unter der Klassendeklaration erklärt:
let downloadQueue = OperationQueue()
Dann im Blick haben Last der Zählung gesetzt:
downloadQueue.maxConcurrentOperationCount = 1
dann die Operation Unterklasse in Code aufrufen:
self.downloadQueue.addOperation(DownloadOperation(col: collectionView, index: indexPath, cell: cell))
Und meine Unterklasse:
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
///
}
}
Wenn ich die DownloadOperation zur DownloadQueue hinzufügen, werden die Aufgaben gleichzeitig ausgeführt (async). Liegt dies daran, dass die von mir ausgeführte Abfrage selbst eine asynchrone Aufgabe ist, sodass der Code überspringt und davon ausgeht, dass die Operation abgeschlossen ist, bevor die asynchrone Abfrage die Möglichkeit hatte, alle Daten abzurufen?
Wenn dies der Fall ist, wie gehe ich auf den Abschluss der asynchronen Abfrage warten, um den Abschluss der NSOperation zu signalisieren ?? Die Abfrage selbst hat einen Completion-Block, aber ich weiß nicht, wie ich sie für diesen Fall verwenden soll.