今まで音声解析の結果を画面に表示する際に、AudioQueueNewInputのコールバックで、UIViewのsetNeedsDisplayを呼ぶようにしていましたが、最新のXcodeだと、メインスレッドで呼ぶように警告がでるようになっていました。
元々UIViewの処理は、すべてメインスレッドで処理する必要がありましたが、AudioQueueNewInputのコールバックで処理しても特に問題なく動いていました。
しかし、作法に従った方がよいので、メインスレッドで処理する方法を調べました。
タイマーを使って定期的に描画する方法もありますが、フレームレートと同期して描画できた方がちらつきを抑えることができます。
調べたところ、以下のようにすればフレームレートと同期して描画できました。
MainView.h
@interface MainView : UIView @property CADisplayLink* displayLink; @end
MainView.m
- (id)initWithCoder:(NSCoder *)aDecoder { // ... _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)]; [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
これで、フレームレートと同じ間隔で、setNeedsDisplayが呼ばれるようになります。