同期処理に 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);
とりあえずやり方わかってよかったです。