2010-11-26 38 views
0

我有一个控制器类,使用异步调用来执行一些网络操作。我的视图层次结构是基于导航的View1 > View2 > View3UIViewController和异步调用

现在让我们假设我的View3 (View3Controller)使用异步调用来执行一些网络操作,View2Controller也实现了一些委托方法。

用户可以使用“返回”按钮随时导航,因此[View3Controller dealloc]被调用。现在我想要完成异步操作!有没有(安全)的方式来确保View3Controller没有得到dealloc'ed直到异步操作完成?

+0

如果应用程序用户不希望网络操作完成,这是由用户指示离开视图 - 为什么你要它完成?当我回到那个观点时,你不能启动另一个连接吗? – 2010-11-26 10:23:39

回答

0

一个解决方案是将异步调用移动到它自己的类,最好由View2Controller或更高级别的人拥有。当推View3Controller时,你只需传递这个新类,如果用户导航回来,它会继续按照你的想法。推View3Controller

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

,并从内部View3Controller

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

开始异步操作时,当

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

,如果用户返回您可以:

想像这样一个对象可能会做这样的事情在navigationController:willShowViewController:animated:View2Controller确实从asyncObject得到回调,如果View3Controller被弹出。

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

如果您需要能够在同一时间,你应该看看通知或志愿接收来自asyncObject事件的几个对象(密钥值观察),而不是使用一个代表。

0

当你按下View3Controller到堆栈中,我假设你正在创建它的一个实例,将其推到堆栈中,然后释放它想:

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

你可以简单地忽略[VC版本]消息直到你的-(void)connectionDidFinishLoading:(NSURLConnection *)connection被调用,那么你知道你已经准备好放弃它了吗?