2013-04-26 44 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