Während Ansicht auf Navigationsleiste Schalt, wie NSOperationQueue Gewinde sicher ohne EXC_BAD_ACCESS Fehler beenden
-
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];
}
}
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];