2013-04-26 20 views
2

我有一个模式的看法如下键值观测方法:的iOS:键 - 值观察并没有消除模式的看法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"uploadComplete"]) { 
    NSLog(@"UploadVC hears upload complete"); 
    [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
} 

我用它来观看照片对象,并知道什么时候完成上传。当我运行这个它的表现不如预期,以及控制台日志“UploadVC听到上传完成” - 但是不执行以下行 - 情态不会被解雇。

有任何错误或其他任何东西,认为只是坐在那里和模态永远不会被解雇。这里发生了什么?

+0

您能否显示出现问题的视图控制器的代码?这听起来可能是它被推到了导航堆栈上,而不是以模态方式呈现。 – Caleb 2013-04-26 15:46:40

+0

有人提出模态,在呼叫控制器'[自presentViewController:uploadViewController动画:YES完成:无];' – Andrew 2013-04-26 15:49:53

回答

4

,当您收到后台线程志愿通知等尝试更新UI可能会导致任何意外的行为可能发生(UI没有改变,改变后的一些延迟,应用程序崩溃等等等等)。请确保您在主线程中调用所有更新的UI代码:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"uploadComplete"]) { 
    NSLog(@"UploadVC hears upload complete"); 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    }); 

    } 
} 
+0

1大点。 – Caleb 2013-04-26 15:48:17

+0

我们走了。后续问题:你怎么知道一个方法将从后台线程调用?我如何预测未来这种行为?而且 - dispatch_async是什么?对不起,我是iOS新品!谢谢你的帮助。 – Andrew 2013-04-26 15:51:01

+0

基本上你,如果你不能确定哪个线程方法可以叫你应该在代码“防守”,并确保你将在主线程中更新UI。 dispatch_async是在任意的调度队列(在这里我们使用主队列这基本上是等同于执行在主线程块)异步执行块的方法。你可以阅读更多有关所有在这里http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html – Vladimir 2013-04-26 15:54:25