触摸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     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...