我想創造一個GCD宏調用例如像:爲GCD調用寫入宏?
dispatch_async(dispatch_get_main_queue(), ^{
stuff....
});
宏可能是這個樣子: 主(^ {...})?
不知道該怎麼寫。任何建議?
謝謝
我想創造一個GCD宏調用例如像:爲GCD調用寫入宏?
dispatch_async(dispatch_get_main_queue(), ^{
stuff....
});
宏可能是這個樣子: 主(^ {...})?
不知道該怎麼寫。任何建議?
謝謝
可以定義宏是這樣的:
#define ASYNC(...) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ __VA_ARGS__ })
#define ASYNC_MAIN(...) dispatch_async(dispatch_get_main_queue(), ^{ __VA_ARGS__ })
第一個將調用該代碼在未指定的線程上異步執行(使用它執行所有長時間運行的任務),第二個代碼將在主線程上異步調用該塊(執行所有與UI相關的使用它的東西)。
您可以將兩者結合使用。比方說,你想抓住從網絡和更新UI的東西,你可以這樣寫:
ASYNC({
NSString *result = [[NSString alloc] initWithContentsOfURL: ...];
ASYNC_MAIN({
self.myTextField.string = result;
[result release];
});
});
您添加大括號,使Xcode的縮進的代碼正確。
請注意保留/釋放呼叫的位置。這是一個強大的技術,可以讓你的代碼可讀。
建議:不要。除此之外,它會在調試中搞砸行號。
實際上,你可以定義一個正常的功能,將做同樣的事情,如果你想,像
typedef void(^VoidBlock)();
void on_main(VoidBlock block) {
dispatch_async(dispatch_get_main_queue(), block);
}
這樣做,你不調試過程中失去行號塊的優勢。我甚至做過像
void on_main(VoidBlock block) {
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
}
我可以從主要隊列調用或不。
你真的想要避免在宏參數中放置代碼塊。如果你確實需要調試那些代碼,你會恨自己的。 (有點舌頭在臉頰,但它確實是痛苦的,如果你要調試擴展到多行代碼任何宏)。
我會說,命名你的任何函數'main'都不是好風格(C的'main'函數)。 – 2014-07-30 18:19:37
什麼都沒有被命名爲'main'。 'main'被用作名稱的一部分來表示與主應用程序線程的關聯,但這只是遵循Apple設置的模式,例如'dispatch_get_main_queue'。 – smparkes 2014-07-31 01:07:06
在你的第一部分代碼中,你定義了一個名爲'main'的函數,它返回'void'並將一個'VoidBlock'作爲參數。我不會調用一個函數,即使它只能從單個文件中看到。 – 2014-07-31 09:14:16