在我的应用程序中,我有一个显示为模式视图控制器的登录屏幕。一旦用户成功登录,模式视图就会被关闭,应用程序的数据会从 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
在模态视图控制器关闭后显示的主视图控制器中调用 for,则按-doBackgroundSync
预期连续调用。
什么会导致这种行为?是否有一些东西-dismissModalViewController
会使该视图控制器创建的运行循环中的任何内容无效?