本来、私はNSDictionary
のデータセットを持っていますが、便宜上、いくつかの方法でデータをソートしてフィルタリングしてNSArray
を設定しています。データは別のスレッド(ブロック)を介して入力されます。データストアを変更する際にブロックが1つしかないことを確認します。@synchronizedブロック対GCD dispatch_async()
私は今日の午後にディスパッチキューを設定する手間を経て、ランダムに、@synchronized
についての投稿に遭遇しました。
だから私は今でてきたものを...
// a property on my object
@property (assign) dispatch_queue_t matchSortingQueue;
// in my object init
_sortingQueue = dispatch_queue_create("com.asdf.matchSortingQueue", NULL);
// then later...
- (void)sortArrayIntoLocalStore:(NSArray*)matches
{
dispatch_async(_sortingQueue, ^{
// do stuff...
});
}
そして、私の質問は、私は次のようにこのすべてを置き換えることができますか?
- (void)sortArrayIntoLocalStore:(NSArray*)matches
{
@synchronized (self) {
// do stuff...
};
}
...とにかく2つの違いは何ですか?私は何を考慮すべきですか?
'@ synchronized'は本当に遅いです。私が今見ている指標を見つけることができませんが、https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.htmlもチェックしてください。 – Richard
あなたのデータが同じディスパッチキュー(同じスレッド)を介して入ってくる場合、それらは衝突しません。異なるキュー(異なるスレッド)を使用する場合は、同期が必要です。 – Jeremy
それを見つけました(http://stackoverflow.com/q/10094361/480850経由):http://perpendiculo.us/?p=133 – Richard