2010-11-26 9 views
0

ich eine Controller-Klasse, die asynchrone Aufrufe verwendet einige Netzwerk-Operationen auszuführen. Meine Ansichtshierarchie ist navigationsbasiert, z. View1 > View2 > View3.UIViewController und asynchrone Aufrufe

Nehmen wir nun an, dass meine View3 (View3Controller) asynchrone Aufrufe verwendet, um einige Netzwerkoperationen durchzuführen, und View2Controller implementiert auch einige der Delegate-Methoden.

Der Benutzer kann „Zurück“ -Taste verwenden, jederzeit zurück zu navigieren, und folglich [View3Controller dealloc] aufgerufen wird. Jetzt möchte ich die asynchrone Operation abschließen! Gibt es einen (sicheren) Weg, um sicherzustellen, dass View3Controller nicht dealloc ‚ed bekommt, bis der Asynchron-Vorgang abgeschlossen ist?

+0

Wenn die App Benutzer der Netzwerkbetrieb nicht will, zu vervollständigen, die vom Benutzer angegeben wird die Navigation aus der Sicht entfernt - warum wollen Sie es vervollständigen? Kannst du nicht eine andere Verbindung starten, wenn ich zu dieser Ansicht zurückkomme? –

Antwort

0

Eine Lösung ist der asynchrone Aufruf zu seiner eigenen Klasse zu bewegen, vorzugsweise durch View2Controller oder jemand höher besaß. Wenn Sie View3Controller drücken, geben Sie einfach diese neue Klasse weiter und wenn der Benutzer zurück navigiert, wird es weiter so wie Sie wollen.

Stellen Sie sich vor, ein Objekt wie:

AsyncObject : NSObject {} 
@property (nonatomic, assign) id delegate; 
- (void)start; 

und wenn View3Controller

View3Controller *view3Controller = ... 
view3Controller.asyncObject = self.asyncObject; 
[self.navigationController pushView....]; 

drücken und wenn die Operation async ab innerhalb View3Controller

self.asyncObject.delegate = self; 
[self.asyncObject start]; 

, wenn der Benutzer Sie navigiert zurück konnte macht möglicherweise so etwas in navigationController:willShowViewController:animated: in View2Controller do die Rückrufe von asyncObject zu bekommen, falls View3Controller knallte wird.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    if (viewController == self) { 
    self.asyncObject.delegate = self; 
    } 
} 

Wenn Sie müssen in der Lage sein, Ereignisse zur gleichen Zeit von der asyncObject für mehrere Objekte erhalten Sie Benachrichtigungen oder KVO (Key Value Observing) anstelle der Verwendung eines Delegaten aussehen sollte.

0

Wenn Sie die View3Controller auf den Stapel schieben, gehe ich davon aus Sie eine Instanz davon erstellen, sie auf den Stapel schieben und dann mag es loslassen:

-(void)someMethod { 
    View3Controller *vc = [[View3Controller alloc] init]; 
    [self.navigationController pushViewController:vc animated:YES]; 
    [vc release]; 
} 

Sie könnten einfach die [vc release] auslassen Nachricht, bis Ihre -(void)connectionDidFinishLoading:(NSURLConnection *)connection heißt, dann wissen Sie, dass Sie bereit sind, loszulassen?

Verwandte Themen