0

ブロックなしでGCDを使用することは可能ですか? mikeash が彼の投稿で述べているように、_f バリアントを使用して GCD を使用する方法はありますか。私は周りを検索しましたが、どちらの側にも証拠はありません。可能か不可能か。

実行可能な場合は、例を挙げてください。

/セルビン

4

2 に答える 2

3

もちろん可能です!_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 のパラメーターのないブロックだけに制限されず、通常の関数を使用できます。

于 2013-07-23T14:26:12.783 に答える