触摸UIScrollview时,NSTimer冻结

问题描述

| 我正在编写一个基于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