2011-02-28 21 views
0

我做了這個在iphone中performSelectorOnMainThread中的問題


[(OfficeLinQViewController*)sharedManager.m_o performSelectorOnMainThread:@selector(findLocalListing::) 
                   withObject:(folderList,path) 
                  waitUntilDone:NO];
但問題是,在findLocalListing函數中,兩個參數路徑都保存的不是folderList。

回答

5

再看看withObject:部分。它用withObject表示,而不用object。您只能將一個參數傳遞給選擇器。

我通常用像這樣的包裝方法來解決這些問題。

[(OfficeLinQViewController*)sharedManager.m_o performSelectorOnMainThread:@selector(findLocalListingWithArgumentArray:)withObject:[NSArray arrayWithObjects:folderList,path, nil] waitUntilDone:NO]; 

- (void)findLocalListingWithArgumentArray:(NSArray *)argArray { 
    [self findLocalListing:[argArray objectAtIndex:0] inPath:[argArray objectAtIndex:1]]; 
} 

哦,你應該重命名findLocalListing ::有用。

+0

如果該方法需要很長時間才能在主線程上運行,會發生什麼情況?因爲waitUntilDone是NO,所以在主線程仍在使用它的時候,你可能會在後臺線程中自動釋放你的數組; – deanWombourne 2011-02-28 14:04:25

+2

@dean請參閱performSelectorOnMainThread的文檔:...'此方法保留接收器和arg參數,直到選擇器執行。' – 2011-02-28 14:09:42

+0

感謝朋友,我做到了。 – Nitin 2011-02-28 14:42:16

0

我想應該是更像是這樣的:

[(OfficeLinQViewController*)sharedManager .m_o performSelectorOnMainThread:@selector(findLocalListing:) withObject:(folderList) waitUntilDone:NO]; 

注意,我刪除從@selector參數第二個冒號以及在withObject:參數的第二個參數。 performSelectorOnMainThread不支持先發送多個對象,而無需首先將它們包裝在某種集合中。

但是,您可以像上面提到的here那樣向NSObject添加一個類別。它應該沒問題,但我總是謹慎地向基礎對象添加方法。

+0

我必須使用m_o和兩個冒號。因爲m_o是我調用該函數的對象。 – Nitin 2011-02-28 13:42:05

+0

已修改。我想你會發現我包含的鏈接很有幫助。 – FreeAsInBeer 2011-02-28 13:55:25

0

您只能傳遞一個對象來執行選擇器。我注意到,您嘗試使用的形式,兩個人通過:

(folderList,path) 

這個元組的形式是允許在C,但它不會做什麼,你認爲它。我相信它會評估元組中的每個項目,但總體上這個元組將評估最後一個項目的估值。

如果需要通過有問題的選擇得到了一些東西,你有幾種選擇:

  • 將它們包裝容器中的對象(無論是推出自己的,或者使用somesort的集合,這誠然感覺有點鬆)
  • 有選擇的代碼能夠獲得從某處值而不傳遞作爲PARAMS(例如,作爲一個屬性進行訪問從某處)

順便說一下,把東西等。和_中的變量名稱是非常不標準的。您關心的多少取決於您,但如果其他人必須閱讀您的代碼(包括本網站上的用戶),則可以考慮遵守常規的命名約定。

1

我同意所有其他答案 - 您只能傳遞一個對象。但是,我通常以不同的方式解決它。

我用一個NSDictionary握住你的對象

NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys: 
         folderList, @"folderList", path, @"path", nil]; 
[(OfficeLinQViewController*)sharedManager.m_o performSelectorOnMainThread:@selector(findLocalListing:) withObject:info waitUntilDone:NO]; 

而且在findLocalListing

- (void)findLocalListing:(NSDictionary *)info { 
    NSString *path = [info objectForKey:@"path"]; 
    NSArray *folderList = [info objectForKey:@"folderList"]; 

這可以讓你想要的:)


如果你傳遞儘可能多的對象不喜歡NSDictionary,你可以創建自己的對象,並通過它:)