這工作,但它是一個有點反模式。如果調用方法的線程不是主線程,我會做的就是拋出一個錯誤。調用者有責任確保在正確的線程上調用方法,這些類型的黑客只會鼓勵難看的代碼。此外,如果你依賴於這個,突然間你每次調用這個方法都會使消息調度開銷加倍。
如果你真的不能改變調用者的行爲,你可以嘗試以下方法:
-(void)methodToBeRunOnMainThreadWithObj:(id)object {
dispatch_sync(dispatch_get_main_queue(), ^{
// code goes here
});
}
這將導致在主線程中執行的調度塊內的所有代碼,並且該方法不會返回,直到它是完整的。如果您希望立即返回該方法,則可以使用dispatch_async
代替。如果你使用dispatch_sync
,你甚至可以在具有非void返回類型的方法上使用這個技巧。
此代碼還具有支承與是非對象類型(int
等)的參數的方法的額外益處。它也支持具有任意數量參數的方法,而performSelector:withObject:
及其兄弟方法僅支持有限數量的參數。另一種方法是設置NSInvocation
對象,這是一種痛苦。
注意,這需要大中央調度(GCD)你的平臺上。
多麼可愛的把戲! – Gerstmann