Frage

Ich habe eine NSInvocationOperation, die eine Reihe von NSXMLDocuments im Hintergrund auf meine UI ansprechbar.

würde herunterladen und analysieren

Mein Versuch, den Invocation Betrieb zu stoppen ist mein NSOperationQueue des cancellAllOperations zu nennen. Aber es scheint, dass dies nicht die Ausführung des Aufrufs zu stoppen.

Alle Ideen, wie würde ich über dieses Problem gehen?

War es hilfreich?

Lösung

Es liegt an der Umsetzung Ihrer NSOperation Objekt tatsächlich Stop , was es tut, aufzuräumen, und beenden, wenn er informiert wird, dass es abgesagt worden ist. Messaging, die Sie alle Vorgänge in der Warteschlange abbrechen möchten wird die Warteschlange verursacht Warteschlangenauflösungs neue Operationen zu stoppen zu laufen und wird die Nachricht an alle Operationen aktuell laufenden abbrechen senden.

In der Operation des Hauptmethode, sollten Sie für isCancelled werden überprüft und Umgang mit diesem Zustand, wenn Sie tatsächlich gelöscht werden.

Weitere Informationen finden Sie in der Erstellen und Verwalten von Betrieb Objekte im Threading Programming Guide.

Andere Tipps

UPDATE: Instruments zeigt Lecks-a-viel, wenn ich dies tun. Gehen Sie mit Vorsicht! ich dies hier im Fall halten bin ich eigentlich auf etwas und jemand anderes kann herausfinden, wie über das Leck Hürde zu erhalten.

Hier ist eine verdrehte Idee, die ich wieder versuchen, wie ich diesen Typen:

Stellen Sie den Betrieb als Objekt für NSInvocationOperation 's initWithTarget: Selektor: Objekt: Methode. Vorausgesetzt, Sie haben bereits eine NSOperationQueue (wir nennen es Warteschlange ):

NSInvocationOperation *operation = [NSInvocationOperation alloc];
operation = [operation initWithTarget:self selector:@selector(myOperation:) object:operation];
[queue addOperation:operation];
[operation release];

Beachten Sie, dass wir die alloc in seinen eigenen Ruf auseinander zu brechen haben. Sonst können wir nicht gesetzt Objekt Betrieb

Dann in Ihrer Arbeitsweise, warf das Objekt zurück und streuen Kontrollen für isCancelled nach Wunsch. Zum Beispiel:

  - (void)myOperation:(id)object {
    NSInvocationOperation *operation = (NSInvocationOperation *)object;
    if ([operation isCancelled]) return;
    ...
  }

Stellen Sie sicher, dass Ihre Wähler endet mit einem Doppelpunkt zurück in die initWithTarget. ... Anruf, da Sie jetzt in einem Objekt übergeben werden, werden

So weit, so gut. Nun, wenn ich zwingen kann, cancelAllOperations , ich werde wissen, ob dies tatsächlich funktioniert. :)

Sie müssen überprüfen, ob NSInvocationOperation isCancelled JA. Um das zu tun in NSInvocationOperation, können Sie Key Value Observing verwenden:

Fügen Sie Ihr Objekt als NSInvocationOperation isCancelled Beobachter, wenn die Operation ausgeführt wird:

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:<targetObj> selector:@selector(<targetMethod>) object:nil];
[operation addObserver:<targetObj> forKeyPath:@"isCancelled" options:NSKeyValueObservingOptionNew context:nil];
[operQueue addOperation:operation];
[operation release];

Dann in targetObj implementieren

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

für isCancelled beobachten durch NSOperationQueue des cancellAllOperations geändert. Sie können einen privaten-Flag gesetzt hier und Targetmethod kann es überprüfen und annulliert, wenn nötig.

Die Post oben ist groß, aber zu mehr direkt auf die ursprüngliche Frage zu beantworten: es scheint, dass Sie nicht NSInvocationOperation Objekt stoppen können, weil es nicht Stornierungen kann leider. Sie gehen zu müssen, Unterklasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top