8

基本的に、私はにデータのセットを持っていますNSDictionaryが、便宜上、いくつかNSArrayの異なる方法でデータをソートおよびフィルタリングしていくつかのデータを設定しています。データは異なるスレッド(ブロック)を介して受信されます。データストアを変更するときに、一度に1つのブロックのみが存在することを確認したいと思います。

今日の午後、ディスパッチキューを設定するのに苦労しましたが、それについての投稿にランダムに出くわし、@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つの違いは何ですか?私は何を考慮すべきですか?

4

2 に答える 2

6

機能的な違いはそれほど重要ではないかもしれませんが、それはあなたが期待することです: その場合、@synchronizeあなたが使用しているスレッドは、排他的に実行されるまでブロックされます。シリアル ディスパッチ キューに非同期でディスパッチすると、呼び出し元のスレッドは他の処理を行うことができ、実際に行っていることは常に同じ既知のキューで行われます。

したがって、一度に 1 つのキューからのみ 3 番目のリソースが使用されるようにすることは同等です。

たとえば、メイン キューからユーザー インターフェイスによってアクセスされるリソースがあり、それを変更したい場合は、ディスパッチする方がよいでしょう。そうすれば、ユーザー インターフェイス コードで明示的に を指定する必要がなくなり@synchronize、スレッド スキームの複雑さがオブジェクト内に非常に自然に隠されます。他の異なるアクターでこれらの変更のいくつかをトリガーできる中心的なアクターがある場合は、ディスパッチすることもお勧めします。これにより、それらが同時に動作できるようになります。

同期はよりコンパクトで、ステップ デバッグがはるかに簡単です。実行していることが 2 行または 3 行になる傾向があり、とにかく同期的にディスパッチする必要がある場合は、特に作成の暗黙のコストを考慮すると、キューを作成する努力をする価値がないように感じます。ブロックをヒープに移動します。

于 2013-02-06T05:51:50.427 に答える
4

2 番目のケースでは、"do stuff" が完了するまで呼び出しスレッドをブロックします。queues と dispatch_async を使用すると、呼び出しスレッドをブロックしません。これは、UI スレッドから sortArrayIntoLocalStore を呼び出す場合に特に重要です。

于 2013-02-06T05:45:52.587 に答える