【发布时间】:2010-10-15 14:17:49
【问题描述】:
在我的应用程序中,我有一个显示为模式视图控制器的登录屏幕。一旦用户成功登录,模式视图就会被关闭,应用程序的数据会从 Web 服务中更新。然后,用户可以使用下载的新数据。
我们会定期检查是否有任何数据需要同步回服务器。为此,我们使用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 中是否存在会使该视图控制器创建的运行循环中的任何内容无效的内容?
【问题讨论】:
-
我用您所描述的项目制作了一个简单的应用程序(两个长期存在的视图控制器,其中模态呈现的一个问题是 performSelector:withObject:afterDelay:),它似乎工作得很好.也许还有其他原因导致 -doBackgroundSync 无法注册对其自身的新调用?
标签: ipad ios modalviewcontroller