2010-10-15 119 views
0

在我的申请,我已经呈现为模态的视图控制器的登录画面。一旦用户成功登录,模式视图将被解除,应用程序的数据将从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中的某些内容会使该视图控制器创建的运行循环中的任何内容失效?

+0

我用你描述的项目做了一个简单的应用程序(两个长寿命的视图控制器,其中模态呈现的视图控制器发出performSelector:withObject:afterDelay :),它似乎工作得很好。也许还有其他的事情会让-doBackgroundSync注册一个新的呼叫给自己? – 2010-10-16 19:27:31

回答

0

去这里更多细节View Controller Programming Guide for iOS,而是“解雇”一个模态控制器返回应用到以前的状态。维护你的运行循环的建议方法是从模态控制器请求代理给你。