2010-04-15 102 views
0

我剛碰到這種奇怪的情況。概念性問題:performSelectorOnMainThread做什麼?

我正在使用蘋果示例中的懶惰圖像加載技術。

當我在我的應用程序中使用該類時,它給了我要學習的主題,但不要在那裏實際發生的事情。

所以這裏去的情景:

我想大家都已經看到了蘋果lazytableimagesloading。

我重裝了我的桌子上整理數據的解析:

- (void)didFinishParsing:(NSMutableArray *)appList 
    { 


    self.upcomingArray = [NSMutableArray arrayWithArray:loadedApps]; 

    // we are finished with the queue and our ParseOperation 
[self.upcomingTableView reloadData]; 


     self.queue = nil; // we are finished with the queue and our ParseOperation 

    } 

但作爲結果的連接沒有開始和圖像不加載。當我完全照搬lazyimageloading和我換成上面的代碼用下面的代碼,它工作正常

- (void)didFinishParsing:(NSMutableArray *)appList 
{ 


[self performSelectorOnMainThread:@selector(handleLoadedApps:) withObject:appList waitUntilDone:NO]; 


    self.queue = nil; // we are finished with the queue and our ParseOperation 

} 

所以我想知道的是這背後的概念。

請讓我知道如果你不明白的問題或細節是不夠的,因爲我拼命想知道爲什麼它是這樣的?

LazyTableImages

回答

3

這種方法只是調用您選擇的方法,但使得它在主線程上執行。主線程負責更新UI和處理應用程序主運行循環。即使NSApplication對象也處理主線程上的事件。

因此,通過使用此方法,您需要使用Objective-C選擇器作爲參數傳遞您想要執行的方法,該對象旨在表示您的輸入方法,或者如果您的方法不需要參數,最後是一個布爾值,指示是否要在執行方法之前阻止,或者如果您希望立即返回而不等待您的方法執行。

如果您的方法需要多個參數,則將所有必需參數包裝到例如NSDictionary中,並傳遞字典對象作爲第二個參數。

在你的情況,爲了重新加載表,你需要更新主線程中的UI。

+0

所以nsurlconnection只能執行如果我在主線程執行表重裝,對不對? – harshalb 2010-04-15 13:31:43

+1

@hib NSURLConnection與表重新加載無關。如果您有一個在後臺線程上執行的方法,但它需要在某個時候更新用戶界面,則必須在主線程上執行該用戶界面更新。 – 2010-04-15 19:07:23