2010-11-26 21 views
0

いくつかのネットワーク操作を実行するために非同期呼び出しを使用するコントローラクラスがあります。私のビュー階層は、例えば、 View1 > View2 > View3UIViewControllerと非同期の呼び出し

ここで、私のView3 (View3Controller)が非同期呼び出しを使用してネットワーク操作を実行し、View2Controllerもデリゲートメソッドの一部を実装しているとします。

ユーザーはいつでも戻ってナビゲートするために「戻る」ボタンを使用することができ、その結果、[View3Controller dealloc]が呼び出されます。今私は非同期操作を完了したい!非同期操作が完了するまで、View3Controllerdeallocを取得しないようにする(安全な)方法はありますか?

+0

ユーザーがネットワーク操作を完了しないようにするには、ユーザーがビューから離れていることが示されます。なぜそれを完了したいのですか?私がそのビューに戻ったときに別の接続を開始できませんか? –

答えて

0

解決策の1つは、非同期呼び出しを、好ましくはView2Controllerまたはそれ以上の所有者が所有するクラスに移動することです。 View3Controllerを押すと、この新しいクラスを渡すだけで、ユーザーが後ろをナビゲートすると、必要に応じて続行されます。

のようなオブジェクトを想像:

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

、ユーザーがあなたを戻って移動した場合

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

から非同期操作を可能性が開始するときView3Controller

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

を押し、潜在的にこのようなことをするnavigationController:willShowViewController:animated: in View3Controllerがポップされる場合は、asyncObjectからコールバックを取得します。

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

あなたは(キーの値が観測)の代わりに、デリゲートを使用して、あなたが通知またはKVOをご覧ください同時に複数のオブジェクトに対してasyncObjectからイベントを受信できるようにする必要がある場合。

0

あなたがスタックにView3Controllerを押すと、私はあなたが、それのインスタンスを作成するスタックにプッシュし、それが好きでリリースしていると仮定します。

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

あなたは、単に[VC解除]を省略することができメッセージがあなたの-(void)connectionDidFinishLoading:(NSURLConnection *)connectionが呼び出されるまで、あなたはそれを放棄する準備ができていることを知っていますか?

関連する問題