2011-11-30 56 views
40

我想從另一個線程的主線程上執行一個選擇,但選擇具有多個參數,與此類似:的iOS performSelectorOnMainThread使用多個參數

-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e { //... }

我怎樣才能得到這個工作performSelectorOnMainThread: withObject: waitUntilDone:

編輯

我想解釋一下,爲什麼我需要這個。

我在主線程上使用UIImageViews,並在另一個線程上對它們進行了計算。我使用了大量的計算,所以如果我在主線程上做了所有事情,應用程序就會滯後。我知道UI元素只能在主線程上操作,這就是爲什麼我希望它能夠以這種方式工作,所以主線程可以無延遲地監聽觸摸事件。

+0

[performSelectorOnMainThread with multiple parameter]可能重複](http://stackoverflow.com/questions/7693203/performselectoronmainthread-with-multiple-parameter) –

回答

96

當你使用的是iOS> = 4,你應該這樣做,而不是:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self doSomething:1 b:2 c:3 d:4 e:5]; 
}); 

這就像做waitUntilDone:NO。如果您想等到該方法完成,請改用dispatch_sync

+0

你的回答對我的問題是最好的。似乎只有在'dispatch_sync'中有一個'performSelector:afterDelay:'工作。 – McDermott

+0

你可能也想看看[dispatch_after](http://stackoverflow.com/a/4139331/400056),也許你可以將你的'dispatch_sync'和'performSelector:afterDelay:'合併爲一個調用。 – DarkDust

6

你需要使用NSInvocation

創建對象,設置目標,選擇和參數。
然後,使用

[ invocationObject performSelectorOnMainThread: @selector(invoke) withObject: nil, waitUntilDone: NO ]; 
+0

這是如此NextStep ;-)有了GCD這可以更容易地解決。 – DarkDust

+3

當然......但是如果沒有GCD就知道如何去做,可能會很方便,即使GCD現在是首選的方式。 :) – Macmade

3

可以傳遞具有所需參數的NSDictionary/NSArray的類型的一個對象。

並接受函數中相同類型的對象。 然後,分解值並繼續處理。

你必須使用的NSNumber的數值在你的函數把它們添加到的NSArray/NSDictionary中,後來,你可以將它們轉換回來intValue/floatValue

最好的降壓。

+0

我也想傳遞一個UIImageView。我可以用NSArray做到嗎? – McDermott

+1

@McDermott:你可以把*每個*對象放到一個'NSArray'中,所以是的,你也可以傳遞'UIImageView'。 – DarkDust