我正在编写一个基于midi的应用程序。 为了获得精确的midi时钟时序,我使用NSTimer。但在滚动/触摸子视图时,NSTimer会冻结。我试图在子视图中运行Timer,但同样的问题。 有人有想法吗?
这是我的ViewController的代码:
-(void)timerPlay{
midiclock = [NSTimer scheduledTimerWithTimeInterval:0.5/24 target:self selector:@selector(clocksignal) userInfo:nil repeats:YES];
}
-(void)clocksignal{
beatClock ++;
if (beatClock == 1){
const UInt8 clock[2] = { 0xF8, 0xF9};
[midi sendBytes:clock size:2];
}
if (beatClock == 2){
const UInt8 clock[2] = { 0xF8, 0xF9};
[midi sendBytes:clock size:2];
}
.......
if (beatClock == 24){
const UInt8 clock[2] = { 0xF8, 0xF9};
[midi sendBytes:clock size:2];
beatClock = 1;
}
}
- (void)viewDidLoad {
SubView = [[SubView alloc] initWithNibName:@"SubView" bundle:nil];
[scrollView addSubview:matrixView.view];
......
}
答案 0 :(得分:1)
我认为这是因为你的计时器是在主线程上执行的,比如UI的东西,所以你的Timer必须等待主线程变为“空闲”才能执行它。由于您没有更新UI,因此您无需在主线程上执行代码。
一种解决方案是创建一个新线程(NSThread detachNewThread)并在此处执行循环,或使用GCD,而不是使用NSTimer