皆さん!アプリに共有キャッシュを実装しています。バックグラウンドで Web からキャッシュされたデータを取得し、新しく取得したデータでキャッシュと UI を更新するという考え方です。メインスレッドは継続的にキャッシュを使用するため、もちろんスレッドセーフを確保することが秘訣です。他の誰かが使用している可能性がある間は、キャッシュを変更したくありません。
@synchronized を使用して共有リソースへのアクセスをロックすることは、カーネルにトラップされてかなり遅くなるため、ObjectiveC で最も洗練されたアプローチではないことを理解しています。代わりにGCDを使用することは優れた代替手段であると読み続けています(今のところ、そのいとこであるNSOperationは無視しましょう)。私の状況に適したパターンは何かを理解したいと思います. サンプルコードは次のとおりです。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// download the data in a background thread
dispatch_async(queue, ^{
CacheData *data = [Downloader getLatestData];
// use the downloaded data in the main thread
dispatch_sync(dispatch_get_main_queue(), ^{
[AppCache updateCache:data];
[[NSNotificationCenter defaultCenter] postNotificationName:@"CacheUpdated" object:nil];
});
});
- これは実際に私が考えていることを行うでしょうか?もしそうなら、これは今日この種の状況を処理する最もクリーンなアプローチですか? 私が話していることにかなり近いブログ投稿がありますが、あなたにも再確認したいと思いました.
- 同じスレッド/キュー (私の場合はメイン) の共有リソースにのみアクセスし、メインの UI のみを更新する限り、スレッドセーフを効果的に達成できると考えています。あれは正しいですか?
ありがとう!