我有一个控制器类,它使用异步调用来执行一些网络操作。我的视图层次结构是基于导航的View1 > View2 > View3
。
现在让我们假设我的View3 (View3Controller)
使用异步调用来执行一些网络操作,而View2Controller也实现了一些委托方法。
用户可以随时使用“返回”按钮进行导航,从而调用[View3Controller dealloc]
。现在我希望异步操作完成!在异步操作完成之前,是否有(安全)方法确保View3Controller
未获得dealloc
编辑?
答案 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(键值观察)而不是使用委托。