2012-02-24 22 views
3

我想創造一個GCD宏調用例如像:爲GCD調用寫入宏?

dispatch_async(dispatch_get_main_queue(), ^{ 
    stuff.... 
}); 

宏可能是這個樣子: 主(^ {...})?

不知道該怎麼寫。任何建議?

謝謝

回答

3

可以定義宏是這樣的:

#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的縮進的代碼正確。

請注意保留/釋放呼叫的位置。這是一個強大的技術,可以讓你的代碼可讀。

9

建議:不要。除此之外,它會在調試中搞砸行號。

實際上,你可以定義一個正常的功能,將做同樣的事情,如果你想,像

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); 
    } 
} 

我可以從主要隊列調用或不。

真的想要避免在宏參數中放置代碼塊。如果你確實需要調試那些代碼,你會恨自己的。 (有點舌頭在臉頰,但它確實是痛苦的,如果你要調試擴展到多行代碼任何宏)。

+0

我會說,命名你的任何函數'main'都不是好風格(C的'main'函數)。 – 2014-07-30 18:19:37

+0

什麼都沒有被命名爲'main'。 'main'被用作名稱的一部分來表示與主應用程序線程的關聯,但這只是遵循Apple設置的模式,例如'dispatch_get_main_queue'。 – smparkes 2014-07-31 01:07:06

+1

在你的第一部分代碼中,你定義了一個名爲'main'的函數,它返回'void'並將一個'VoidBlock'作爲參數。我不會調用一個函數,即使它只能從單個文件中看到。 – 2014-07-31 09:14:16