ですから、しばらく前に完了ブロックについて学んだ後、私は完了ブロックをたくさん使うのが好きです。私は閉鎖が好きで、好きな場所に何でも渡すことができるのが好きです。
スレッドプログラミングに不慣れな私は、GCDとNSOperationに近づいていませんでしたが、最近、Core Dataに更新された非同期プログラミングを行う必要があり、「すべての完了ブロック」に常に疑問を抱き始めています。 " アプローチ。
それで、私が自分自身に質問していることの1つの例があります:私はどこかのサーバーにアップロードするための一連の潜在的にかなり大きなデータ(画像、音声、ビデオ、あなたが持っているもの)を持っています。これらのデータのメタデータはCoreDataに保存されており、アップロードするオブジェクトを決定するために使用するタイムスタンプがあります。これらのアップロードはすべて順番に実行する必要があります。
私がコーディングしたのは、基本的には完了ブロックを含む関数であり、次のようにブロックの最後にそれ自体を呼び出します。
(void)uploadAllAsynchronously {
... // First figure out what to upload based on core data
// Here comes the completion block in question
void(^blk)(BOOL) = ^(BOOL)uploadSuccess {
... // if upload successful, update core data to mark what has been uploaded
[self uploadAllAsynchronously]; // Recursively calls the function that contains this block. I actually have a weak self, or if that fails to break a retain cycle, I should be able to pass in a NSManagedObjectContext as an argument.
}
[NSURLConnection sendAsynchronousRequest:... queue:... completionHandler:blk];
}
これはうまくいくはずですよね?GCDを使用して自分のキューを処理する必要があることを示唆する、完全に危険なものがここにありますか?コードのどの部分が原因かはわかりませんが、現在データに問題があるため、非同期呼び出しのために別のスレッドが正しく更新されていないように見える可能性があるため、これを求めています。
前もって感謝します。