Ich arbeite mit etwas Code, der eine Reihe asynchroner Operationen mit verschiedenen Rückrufen durchführt; Snow Leopard hat dies mit Blöcken und GCD unglaublich einfach gemacht.Wie leicht ist NSOperationQueue auf Snow Leopard?
Ich rufe NSTask
von einem NSBlockOperation
etwa so:
[self.queue addOperationWithBlock:^{
NSTask *task = [NSTask new];
NSPipe *newPipe = [NSPipe new];
NSFileHandle *readHandle = [newPipe fileHandleForReading];
NSData *inData = nil;
[task setLaunchPath:path];
[task setArguments:arguments];
[task launch];
while ((inData = [readHandle availableData]) && [inData length]) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// callback
}];
}
[task waitUntilExit];
}];
Dieser Ansatz funktioniert perfekt. Es ist wie Magie, solange meine Callbacks die Parallelität korrekt behandeln.
Nun möchte ich in der Lage sein, einige dieser Anrufe zu koaleszieren; Dies befindet sich in der Refresh-Methode eines Modellobjekts und kann sehr lange dauern. Wenn der Benutzer auf den Aktualisierungsbutton klopft, sollte der Rechner und all das nicht gebunden werden.
Ich kann hier ein Implementierungsdilemma sehen. Ich kann eine ganze Reihe von Warteschlangen erstellen - eine pro Anruftyp - und ihre Anzahl der gleichzeitigen Vorgänge auf 1 setzen und dann -cancelAllOperations
anrufen, wenn es Zeit für einen neuen Anruf ist.
Alternativ könnte ich manuelle Buchführung durchführen, auf der derzeit Anrufe ausgeführt werden und eine einzelne Warteschlange pro Modellobjekt verwalten (wie ich es tue), oder ich könnte noch weiter gehen und eine globale Warteschlange verwenden.
Wie schwer ist NSOperationQueue
? Ist das Erstellen vieler Warteschlangen eine schlechte Architekturentscheidung? Gibt es eine bessere Möglichkeit, diese Aufgaben zusammenzuführen?
FYI, du leckst deine NSTask und deine NSPipe. + new ist äquivalent zu + alloc/-init, was bedeutet, dass du für die Freigabe verantwortlich bist ... was du nie tust (in deinem Code oben). (es sei denn natürlich, Sie verwenden GC) –
Es ist ein Snow Leopard-only-Programm. Ich würde sicherlich hoffen, dass Ihr brandneuer Snow-Leopard-Code nur Müll ist. :-D –