ブロックなしでGCDを使用することは可能ですか? mikeash が彼の投稿で述べているように、_f バリアントを使用して GCD を使用する方法はありますか。私は周りを検索しましたが、どちらの側にも証拠はありません。可能か不可能か。
実行可能な場合は、例を挙げてください。
/セルビン
ブロックなしでGCDを使用することは可能ですか? mikeash が彼の投稿で述べているように、_f バリアントを使用して GCD を使用する方法はありますか。私は周りを検索しましたが、どちらの側にも証拠はありません。可能か不可能か。
実行可能な場合は、例を挙げてください。
/セルビン
もちろん可能です!_f
バリアントとは、Mike は接尾辞付きのGCD
関数のセットを意味し_f
ます。これらは通常のGCD
関数の代替ですが、ブロックの代わりにユーザー定義関数をパラメーターとして受け入れることができます。それらはたくさんあります:
dispatch_async_f
dispatch_sync_f
dispatch_after_f
dispatch_apply_f
dispatch_group_async_f
dispatch_group_notify_f
dispatch_set_finalizer_f
dispatch_barrier_async_f
dispatch_barrier_sync_f
dispatch_source_set_registration_handler_f
dispatch_source_set_cancel_handler_f
dispatch_source_set_event_handler_f
次のように定義されている
dispatch_function_t
パラメーターを (通常の代わりに)受け入れます。dispatch_block_t
typedef void (*dispatch_function_t)(void*)
.
*void
ご覧のとおり、ポインターにより、任意のユーザーパラメーターと関数を受け入れることができます。したがってdispatch_function_t
、引数を持たない関数でも使用できます。次のようにラッパー関数を記述できます。
void func(void) {
//do any calculations you want here
}
void wrapper_function(void*) { func(); }
dispatch_async_f(queue, 0, &wrapper_function);
または、関数ポインターをパラメーターとして渡します。または、逆に_f
、varargs(可変引数関数)を介して任意の数の引数を受け入れることができるユーザー定義関数でGCD関数のバリアントを使用できます-上記のように関数ラッパーを記述するだけです。ご覧のとおり、_f
関数はかなり強力なメカニズムであり、GCD のパラメーターのないブロックだけに制限されず、通常の関数を使用できます。