次のように、遅延インスタンス化を使用してシリアル ディスパッチ キューを返すプロパティを定義します。
@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 回タップするとプログラムがハングします。
シリアル キューをコンカレント キューに変更しても問題ありません。好きなだけブロックをキューにディスパッチできます。
何が起こっているのでしょうか?シリアル キューにポストできるブロック数に制限はありますか?