2017-02-02 1 views
0

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.

Antwort

1

Wenn das Ende der main-Funktion erreicht ist, denkt die Vorgangswarteschlange, dass die Operation abgeschlossen ist, unabhängig davon, welche andere Verarbeitung in einer anderen Warteschlange möglicherweise ausgeführt wurde. Soweit es die Operationswarteschlange betrifft, führt sie nur eine Operation zu einem Zeitpunkt wie angefordert aus.

Die Lösung besteht darin, sicherzustellen, dass der benutzerdefinierte Vorgang main nicht zurückkehrt, bis der von ihm gestartete asynchrone Prozess vollständig abgeschlossen ist. Ein gängiger Ansatz besteht darin, eine Versandgruppe oder einen Semaphor zu verwenden. Es gibt viele bestehende Fragen, die diese Lösungen abdecken.

Verwandte Themen