2012-06-29 41 views
0

我有一個模態視圖控制器出現,在互聯網上檢查一個服務,然後在完成時自行解散。筆尖包含活動指示器和標籤,以通知用戶發生了什麼。performSelector:withObject:afterDelay:在模態視圖控制器上不工作

更新完成後,標籤更改爲「更新完成」,然後關閉視圖控制器。但是,我希望它延遲幾秒鐘的解僱時間,讓用戶有機會在文本消失之前看到文本。所以我這樣做了:

#pragma mark - AssetLoaderServiceDelegate 

- (void)assetLoaderServiceDidFinishLoading:(AssetLoaderService *)service 
{ 
    [self.spinner stopAnimating]; 
    self.infoLabel.text = @"Update complete"; 
    [self performSelector:@selector(dismissUpdater) withObject:nil afterDelay:2.0]; 
} 

- (void)dismissUpdater 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

但是由於某種原因,選擇器永遠不會被調用。我試過在NSRunLoopCommonModes模式下運行它,但是這也不起作用。

我必須做一些錯誤的,但我看不出有什麼...

編輯:委託回調的NSOperationQueue,這可能意味着,當它發出的這不是在同一個線程中實際發生的事情消息回到視圖控制器?所以,我想

[self performSelector:@selector(downloadQueueComplete) withObject:nil afterDelay:0.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; 

其次

- (void)downloadQueueComplete 
{ 
    [delegate assetLoaderServiceDidFinishLoading:self]; 
} 

但performSelector似乎並不要麼在這裏工作。

+0

是否dismissUpdater沒有被調用,或dismissModalViewControllerAnimated方法不工作? – rishi

+0

你的意思是:1.調用'assetLoaderServiceDidFinishLoading'; 2.你的模態觀總是在那裏? – sergio

+0

@ rishi - 我的意思是dismissUpdater沒有被調用。 – jowie

回答

2

跟進你有關線程問題的建議,你會嘗試用:

[self performSelectorOnMainThread:@selector(downloadQueueComplete) withObject:nil waitUntilDone:YES]]; 
+0

是的,同一時間得到相同的答案,謝謝!我似乎不需要'NSRunLoopCommonModes'位,但除此之外,問題解決了。歡呼:) – jowie

+0

這是真正的同步性......並感謝接受我的回答,事實上你自己在那裏... – sergio

+0

這只是公平的 - 我問你們的幫助;) – jowie

1

排序!在AssetLoaderService中,我必須在主線程上執行選擇器:

[self performSelectorOnMainThread:@selector(downloadQueueComplete) withObject:nil waitUntilDone:YES]; 

之後,所有以下調用都在正確的線程上。 :)