问题描述
|
我正在编写一个基于Midi的应用程序。
为了获得确切的Midi时钟计时,我使用NSTimer。但是在滚动/触摸子视图时,NSTimer会冻结。我试图在Subview中运行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];
......
}
解决方法
我认为这是因为您的计时器是在主线程(例如UI东西)上执行的,所以您的计时器必须等待主线程变为\“ idle \”才能在其上执行操作。由于您不更新UI,因此不需要在主线程上执行代码。
一种解决方案是创建一个新线程(NSThread detachNewThread)并在此处进行循环,或者使用GCD而不是使用NSTimer