3

塊很棒。因爲我認爲我理解了他們,所以我想提高賭注並在更復雜的情況下使用它們。現在這些街區正在踢我的臉,我試圖把它分解成可理解的片斷。如何在主隊列或線程上分派參數塊

假設我在這個僞代碼中有兩個方塊,名字爲blockAblockB。第一個是一個簡單的無參數塊,它只是打印一行。第二個需要id類型的一個參數xyz

void (^blockA){ NSLog(@"Doing something"); }; 
void (^blockB)(id xyz){ [xyz doSomething]; }; 

當運行blockA,我會做類似blockA();或當我想指定的主隊列/線程,我用的是dispatch_sync_async方法:

dispatch_sync(dispatch_get_main_queue(), blockA); 

雖然我知道如何用blockB(someObject);等參數調度blockB,但我無法弄清楚如何在主線程上顯式調用該函數。我一直在尋找類似的下一行,但當然這不是這是如何工作的:

dispatch_sync(dispatch_get_main_queue,blockB,someObject);

現在我已經嘗試在另一個塊中包裝塊,但說實話,只是看起來不正確,它感覺它引起的問題比解決問題更多。是否有其他的東西,而不是包裝塊來調度主隊列/線程上的一個或多個參數的一個塊?

回答

17

沒有。包裝塊正是你在這種情況下必須做的。在代碼:

void (^block)(id someArg) = someBlock; 
id object = someObject; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    block(someObject); 
}); 

它可能看起來有點怪在第一,但這種風格使得調度API,以便更簡單,拍攝的變量自動保持使其成爲可能。你遇到問題我有點驚訝。他們是什麼?

+0

我得到一個可怕的網絡鎖定崩潰,我不能追溯到它的起源:*試圖從一個線程獲取網絡鎖定其他比主線或網線。這可能是從輔助線程調用UIKit的結果。現在崩潰... *這就是爲什麼我打破了這個問題,因爲在這一點上運行的任何代碼應該已經在主線程上運行。我認爲嵌套塊可能會造成這種情況,但是從你所說的看起來它是另一回事。 – epologee

+0

只是在塊中使用對象有什麼區別?我想你要定義的是dispatch_async(dispatch_get_main_queue(),^ {block(object);});'? – izzy

0

我也習慣了塊。老實說,我看不到什麼更清潔/比以下更好:

dispatch_async(dispatch_get_main_queue(), ^{blockb(someObj);}); 
相關問題