同期処理に semaphore を使う

CloudKit のプログラムを書いていると、サーバに対する Query 処理などでは非同期処理となる。通常はこれで特に問題がないのですが、フィールドの値に Reference 型を指定してある場合、マスターのレコードを query してサーバ側のレコード番号を取得しておく必要が出てくる。

その後、自分のレコードを保存することになりますが、マスターのレコードを query してくるところが間に合わなくて、値を保存し損ねてしまうことがあります、ってか、通信が高速になったとは言え、普通間に合わないです。

こんな時どうすればいのかわからなかったのですが、semaphore を使って同期処理にしてしまえば良いようです。具体的には以下のような形で・・・

        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

     ... some programs ...

    dispatch_semaphore_signal(semaphore);
    });
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

  とりあえずやり方わかってよかったです。