UIViewController和异步调用

时间:2010-11-26 07:50:10

标签: iphone asynchronous delegates uinavigationcontroller

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

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

用户可以随时使用“返回”按钮进行导航,从而调用[View3Controller dealloc]。现在我希望异步操作完成!在异步操作完成之前,是否有(安全)方法确保View3Controller未获得dealloc编辑?

2 个答案:

答案 0 :(得分:0)

当您将View3Controller推入堆栈时,我假设您正在创建它的实例,将其推入堆栈然后释放它:

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

你可以简单地省略[vc release]消息,直到你的-(void)connectionDidFinishLoading:(NSURLConnection *)connection被调用,然后你知道你已经准备好放弃它了吗?

答案 1 :(得分:0)

一种解决方案是将异步调用移动到自己的类,最好由View2Controller或更高级别的人拥有。推送View3Controller时,您只需传递此新类,如果用户导航回来,它将继续按您的意愿继续。

想象一下像这样的对象:

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

并推送View3Controller

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

View3Controller

开始执行异步操作时
self.asyncObject.delegate = self;
[self.asyncObject 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接收多个对象的事件,您应该查看通知或KVO(键值观察)而不是使用委托。