Während Ansicht auf Navigationsleiste Schalt, wie NSOperationQueue Gewinde sicher ohne EXC_BAD_ACCESS Fehler beenden

StackOverflow https://stackoverflow.com/questions/2003445

  •  18-09-2019
  •  | 
  •  

Frage

Ich verwende eine UITableView einige String-Nachrichten anzuzeigen, und ich verwende NSOperationQueue eine maßgeschneiderte NSOperation zu halten, die Nachricht im Hintergrund-Thread fetchs. Nach einer Meldung des UITableView Controller benachrichtigt erfolgreich, besonders angefertigt NSOperation geholt, es zu zeigen.

Wenn ich Taste auf der Navigationsleiste klicken Sie zurück von der UITableView zu anderer Ansicht zu wechseln, nachdem alle Nachricht geladen, ist alles OK. Aber, wenn ich die Zurück-Button klicken, während einige Nachrichten noch geladen werden, ist ein EXC_BAD_ACCESS Wurf. Ich habe überprüft, dass die Ausnahme geschah, während maßgeschneiderte NSOperation UITableView-Controller mit performSelectorOnMainThread Verfahren informieren. Sound wie der Ziel UITableView Controller ist nicht ungültig nach Ansicht umgeschaltet, aber ich denke, Navigation Controller wird die View-Controller-Instanz halten. Darf ich weiß, wie dieses Problem zu lösen? Danke.

Customized Operation wird in den UITableView-Controller mit folgendem Code initialisiert:

StatusMessageLoadingOperation *operation = [[StatusMessageLoadingOperation alloc] 
                                            initWithData:person
                                            messageArray:cachedStatusMessages
                                            target:self 
                                            action:@selector(didFinishStatusMessages:)];
[operationQueue addOperation:operation];
[operation release];

Die maßgeschneiderte NSOperation Klasse UITableView mit folgendem Code aktualisieren:

- (void)main{
    for (int i = 0; i < [[person statusMessages] count]; i++) {
        [target performSelectorOnMainThread:action withObject:messageArray waitUntilDone:NO];
    }
}
War es hilfreich?

Lösung

Haben Sie [operationQueue cancelAllOperations] in Ihrem viewWillDisappear Methode versucht, ruft an?

Andere Tipps

Da ein View-Controller-popping betreffenden -dealloc Methode des Controllers ruft, können Sie Ihre Warteschlange zu früh, und einiger anderer Teil Ihrer Anwendung veröffentlichen versucht, die Warteschlange zuzugreifen oder eine Operation im Innern, dass nicht mehr existiert.

Meine Empfehlung ist Ihre NSOperationQueue *myQueue Instanz in Ihre Anwendung delegieren zu setzen.

Mit dem -applicationDidFinishLaunching: und -dealloc Methoden des AppDelegate initialisieren und lassen Sie Ihre Warteschlange und seinen Inhalt.

Durch die Warteschlange aus den View-Controller zu trennen, wird die Warteschlange nicht freigegeben werden, wenn Sie einen View-Controller von Ihrem Navigationsstapel abspringt. Es und die verbleibenden Operationen noch auf den Rest der Anwendung zur Verfügung stehen sollen.

Um es einfacher zu machen Warteschlange zuzugreifen, die folgende Makrodefinition ein:

#define UIAppDelegate ((MyAppDelegate *)[UIApplication sharedApplication].delegate)

Sie können dann das Makro verwenden Ihre Warteschlangen zuzugreifen, wie folgt, z.

NSLog(@"%@", [[UIAppDelegate myQueue] operations]);

Oder zum Beispiel:

[[UIAppDelegate myQueue] addOperation:myOperation];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top