-performSelector:afterDelay:和模态视图控制器
问题描述:
在我的申请,我已经呈现为模态的视图控制器的登录画面。一旦用户成功登录,模式视图将被解除,应用程序的数据将从Web服务中更新。用户可以使用下载的新数据。-performSelector:afterDelay:和模态视图控制器
我们会定期检查,看看是否需要任何数据被同步回服务器。我们通过使用我们的AppDelegate
中的一组函数定期轮询任何更改来做到这一点。我们有开始轮询方法之一:
- (void) startBackgroundSync {
if (self.queue == nil) {
self.queue = [[NSOperationQueue alloc] init];
}
[self performSelector:@selector(doBackgroundSync) withObject:nil afterDelay:5.f];
}
然后-doBackgroundSync
实际检查的变化,并增加了一个同步操作的NSOperationQueue
。然后,复位本身,像这样:
-(void) doBackgroundSync {
NSLog(@"Check for changes");
// check for changes and add operation to queue
[self performSelector:@selector(doBackgroundSync) withObject:nil afterDelay:5.f];
}
本来,我们从模态登录视图控制器称为-startBackgroundSync
(它被解雇之前)。然后,我们改变一些其他设置并关闭模态视图控制器。登录视图控制器在解散时不会被释放,而是被AppDelegate保留(稍后有时我们必须“重新锁定”应用程序)。模态视图控制器被解雇后,-doBackgroundSync
从未被调用。如果我们把呼吁-startBackgroundSync
在模态视图控制器驳回后,在显示的主视图控制器,然后-doBackgroundSync
持续预期调用。
什么会导致这种行为?是否有-dismissModalViewController
中的某些内容会使该视图控制器创建的运行循环中的任何内容失效?
答
去这里更多细节View Controller Programming Guide for iOS,而是“解雇”一个模态控制器返回应用到以前的状态。维护你的运行循环的建议方法是从模态控制器请求代理给你。
我用你描述的项目做了一个简单的应用程序(两个长寿命的视图控制器,其中模态呈现的视图控制器发出performSelector:withObject:afterDelay :),它似乎工作得很好。也许还有其他的事情会让-doBackgroundSync注册一个新的呼叫给自己? – 2010-10-16 19:27:31