2012-02-24 9 views

答えて

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

まず一つが起動します不特定のスレッドでコードを非同期的に(それを使って長い実行中のすべてのタスクを実行する)、2番目のスレッドはメインスレッド上でブロックを非同期的に起動します。

あなたは両方を組み合わせることができます。あなたが書くことができ、あなたがネットワークから何かをつかむと、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'機能)でないことを言うでしょう。 –

+0

「main」という名前はありません。 'main'はメインのアプリケーションスレッドとの関連を示すために名前の一部として使われていますが、それはAppleの設定したパターン、例えば' dispatch_get_main_queue'に従うだけです。 – smparkes

+1

は、コードのあなたの最初のチャンクでは、 'void'を返し、引数として' VoidBlock'を取る 'main'という関数を定義しています。私はそれが単一のファイルからしか見えないとしても、その関数を呼び出さないでしょう。 –

関連する問題