11

私は初めてキューの制御を開始しましたが、キューの使用方法をうまく理解しているように感じます。また、キューを非常に簡単に使用できるようにしたことに対するAppleへの称賛もあります。

しかし、私が遭遇したのは、同じオブジェクトの読み取りと書き込みを行う複数のスレッドの課題です。この質問で私はこの素晴らしい答え@synchronizedを得ました、そしてそれは私がvsの賛否両論を理解することを確認するために皆からのいくつかの確認を求めることを私に残しますGCD dispatch_barrier_async

これは私がそれを見る方法です:

 @synchronized

PRO:アクセス/ポインタがあれば、任意のオブジェクトをラップできます。@synchronizedこれにより、プログラム内のさまざまなオブジェクトから共有データモデルを安全に処理できます。

PRO:iOS 4(およびおそらくそれ以前)でサポート

 `dispatch_barrier_async` with custom DISPATCH_QUEUE_CONCURRENT

PRO:@synchronizedよりも高速です

CON:DISPATCH_QUEUE_CONCURRENTはiOS 5でのみ使用可能であるため(ここで説明)、iOS4のサポートには使用できません

CON:他の多くのオブジェクトからのオブジェクトの読み取り/書き込みを制御する場合、キューはそれを作成するオブジェクトのみが最も簡単に利用できるため、使いやすさは劣ります(この制限を回避するための作業は必要ありません)

要約すると、上記を考慮すると、最適なツールはプログラムのニーズによって異なります。

誰かが何か追加したり指摘したりすることがあれば、私はそれをいただければ幸いです。

4

1 に答える 1

4

さて、指摘すべきいくつかのことがあります:

1)@synchronizedを使用すると、アプリのiOS(またはOSX)の完全な例外フレームワークが取り込まれます。私はこれをOSXで知っており、パフォーマンスに影響を与えます。iOSで確実に言うことはできませんが、同じことを期待します。とは言うものの、これはスレッジハンマーを使用して釘を打ち込むことです-その機能は他のオプションが利用可能になる前に近づいていました。私は個人的にペストのような使用を避け、ディスパッチセマフォを使用するために他のオープンソースフレームワークを移植しました(マイクアッシュに(もう一度)感謝します!)

2)「DISPATCH_QUEUE_CONCURRENT」についてのあなたのコメントは一種の赤いニシンです-iOS 4以降、システムは3つの同時キューを提供しているので、独自のキューを定義する必要がある場合は、実際に限界を押し広げています。ディスパッチを使用すると、非同期と同期、シリアルとコンカレントのグループがあり、待機してからディスパッチできます。ここにはそのような豊かさがあります1)をどうやって考えることができますか?ブロックを使用すればするほど、ブロックを使用できるようになります。

編集:iOS 4.3アプリで、すべてのMikeAshバリアテクニックとともにカスタム同時キューを使用しました。queue.hファイルはそれを利用可能として示します:

__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
DISPATCH_EXPORT DISPATCH_CONST DISPATCH_WARN_RESULT DISPATCH_NOTHROW
dispatch_queue_t
dispatch_get_global_queue(dispatch_queue_priority_t priority, unsigned long flags);

/*!
 * @const DISPATCH_QUEUE_SERIAL
 * @discussion A dispatch queue that invokes blocks serially in FIFO order.
 */
#define DISPATCH_QUEUE_SERIAL NULL

/*!
 * @const DISPATCH_QUEUE_CONCURRENT
 * @discussion A dispatch queue that may invoke blocks concurrently and supports
 * barrier blocks submitted with the dispatch barrier API.
 */
#define DISPATCH_QUEUE_CONCURRENT (&_dispatch_queue_attr_concurrent)
于 2012-08-12T23:20:19.860 に答える