0

次のように、遅延インスタンス化を使用してシリアル ディスパッチ キューを返すプロパティを定義します。

@property (nonatomic, readonly) dispatch_queue_t queue;

- (dispatch_queue_t)queue
{
    if (!_queue) {
        _queue = dispatch_queue_create("com.example.MyQueue", NULL);
    }
    return _queue;
}

次に、キューにブロックを追加するボタンのアクション メソッドを定義するとします。

- (IBAction)buttonTapped:(UIButton *)sender
{
    dispatch_async(self.queue, ^{
        printf("Do some work here.\n");
    });
}

実際のメソッドのコードは単純な print ステートメントよりも複雑ですが、この例ではこれで十分です。

ここまでは順調ですね。ただし、プログラムをビルドして実行すると、ボタンを 10 回タップしてブロックが実行されるのを確認できますが、11 回タップするとプログラムがハングします。

シリアル キューをコンカレント キューに変更しても問題ありません。好きなだけブロックをキューにディスパッチできます。

何が起こっているのでしょうか?シリアル キューにポストできるブロック数に制限はありますか?

4

2 に答える 2

0

最大ブロック数に関する質問への回答として、キューに入れることができるもの (使用可能なメモリ以外) に実質的な制限がないことを知っています。確かに、問題なく 10 をはるかに超える列に並ぶことができるはずです。

queueしかし、 getter メソッドにタイプミスがあります。を設定しています_queueが、 を返しqueueます。設定したものと同じ変数を返す必要があります。2 つの ivar を定義する必要があるようです。おそらく手動で定義したものと合成されたものですか?手動で宣言されたインスタンス変数がある場合は、それを削除して、getter メソッドが同じインスタンス変数、つまり合成されたインスタンス変数を使用していることを確認する必要があります。また、メソッドでこの ivar を初期化していますinitか?

これを修正しても問題が解決しない場合は、このキューにディスパッチしている特定のコードに問題がある可能性があり、それを私たちと共有する必要があります。そこに同期コードはありますか?共有リソースとのやり取りはありますか?

于 2013-08-28T06:24:43.140 に答える