Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITextView滚动时未触发NSTimer_Ios_Objective C - Fatal编程技术网

Ios UITextView滚动时未触发NSTimer

Ios UITextView滚动时未触发NSTimer,ios,objective-c,Ios,Objective C,我有一个UITextView,我正在使用它打印从文件中读取的大量数据。我把它放在一个NSTimer上,这样每秒100次我就可以输入一行数据,将它打印到文本视图,然后处理数据,并使用NSLog输出一些东西。但是,每当我滚动textView时,我注意到在滚动完成之前,没有任何内容通过NSLog输出到控制台 滚动条会阻止主线程还是什么 -(void) initialize{ ... timer = [NSTimer scheduledTimerWithTimeInterval:.01

我有一个UITextView,我正在使用它打印从文件中读取的大量数据。我把它放在一个
NSTimer
上,这样每秒100次我就可以输入一行数据,将它打印到文本视图,然后处理数据,并使用
NSLog
输出一些东西。但是,每当我滚动textView时,我注意到在滚动完成之前,没有任何内容通过
NSLog
输出到控制台

滚动条会阻止主线程还是什么

-(void) initialize{
    ...
    timer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(hit:) userInfo:nil repeats:YES];
}

-(void)hit:(NSTimer*)time{
    double percentage = (double)lineIndex/(double)lines.count;
    //NSLog(@"%f", percentage);
    if (lineIndex < lines.count){
        [self recievedString:[lines objectAtIndex:lineIndex]];
        lineIndex += 1;
    }else{
        [time invalidate];
        timer = nil;
        [self.delegate finished];
    }
}

-(void)recievedString:(NSString *)line{
    NSArray *pieces = [line componentsSeparatedByString:@","];
    double accZ = [pieces[0] doubleValue];
    double accMag = [pieces[1] doubleValue];
    double gyroX = [pieces[2] doubleValue];
    double gyroZ = [pieces[3] doubleValue];
    [self crunchDatawithAccZ:accZ andAccMag:accMag andGyroX:gyroX andGyroZ:gyroZ];
}

-(void)crunchDatawithAccZ:(double)accZ andAccMag:(double)accMag andGyroX:(double)gyroX andGyroZ:(double)gyroZ {
    accMag = accMag*ACC_SENSITIVITY/(pow(2,DATA_WIDTH-1));
    accZ = accZ*ACC_SENSITIVITY/(pow(2,DATA_WIDTH-1));
    gyroX = gyroX*GYRO_SENSITIVITY/(pow(2,DATA_WIDTH-1));
    gyroZ = gyroZ*GYRO_SENSITIVITY/(pow(2,DATA_WIDTH-1));

    NSLog(@"%f, %f, %f, %f\n", accZ, accMag, gyroX, gyroZ);
    [self.delegate didReceiveData:[NSString stringWithFormat:@"%f, %f, %f, %f\n", accZ, accMag, gyroX, gyroZ]];

    [gyroX_array addObject:@(fabs(gyroX))];
...
}

如果您检查方法的文档

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
它说(我突出显示了runloop模式):

创建并返回一个新的NSTimer对象,并在当前运行循环中以默认模式对其进行调度。 秒后,计时器启动,将消息aSelector发送到目标

当iOS跟踪触摸事件时,主runloop以UITrackingRunLoop模式运行。根据您的代码,计时器在NSDefaultRunLoop模式下注册(也就是说,主runloop没有退出忙,可能只是空闲或等待事件)。因此,在UITrackingRunLoop模式下,runloop非常繁忙,以使UIKit响应尽可能平滑

要解决此问题,您需要在NSRunLoopCommonModes中注册计时器(此值作为模式由所有运行循环模式监控)

以下是我认为对你有帮助的文件摘录:

计时器与跑步循环的特定模式相关联。如果计时器未处于运行循环当前监视的模式,则在您以计时器支持的模式之一运行运行循环之前,它不会启动


如果您不熟悉runloop,请检查此项。

如果您检查方法的文档

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
它说(我突出显示了runloop模式):

创建并返回一个新的NSTimer对象,并在当前运行循环中以默认模式对其进行调度。 秒后,计时器启动,将消息aSelector发送到目标

当iOS跟踪触摸事件时,主runloop以UITrackingRunLoop模式运行。根据您的代码,计时器在NSDefaultRunLoop模式下注册(也就是说,主runloop没有退出忙,可能只是空闲或等待事件)。因此,在UITrackingRunLoop模式下,runloop非常繁忙,以使UIKit响应尽可能平滑

要解决此问题,您需要在NSRunLoopCommonModes中注册计时器(此值作为模式由所有运行循环模式监控)

以下是我认为对你有帮助的文件摘录:

计时器与跑步循环的特定模式相关联。如果计时器未处于运行循环当前监视的模式,则在您以计时器支持的模式之一运行运行循环之前,它不会启动


如果您不熟悉runloop,请选中此选项。

一个
UIScrollView
(或任何类似于
UITextView
的衍生工具)将在滚动时阻止主线程,以保持渲染平滑。这会使自定义计时器停止

要绕过此问题,一种简单的方法是在模式
nsrunlopcommonmodes
中将其添加到主运行循环中:

timer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(hit:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

UIScrollView
(或任何类似于
UITextView
的衍生工具)将在滚动时阻止主线程,以保持渲染平滑。这会使自定义计时器停止

要绕过此问题,一种简单的方法是在模式
nsrunlopcommonmodes
中将其添加到主运行循环中:

timer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(hit:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

A.)显示代码B.)你在做什么听起来很奇怪这和通知有什么关系?你说得对,这不是通知。这是一个计时器。滚动在主屏幕上做了很多事情,但它应该为其他计算留出空间。发布的代码在100Hz下进行了大量计算,但我怀疑更大的问题是在滚动期间同时设置内容偏移量。(考虑以更大的间隔进行快速测试,如0.5,并注释掉
setContentOffset
行)a.)显示代码B.)你正在做的事情听起来很奇怪这与通知有什么关系?你是对的,这不是通知。这是一个计时器。滚动在主屏幕上做了很多事情,但它应该为其他计算留出空间。发布的代码在100Hz下进行了大量计算,但我怀疑更大的问题是在滚动期间同时设置内容偏移量。(考虑以更大的间隔(如0.5)进行快速测试,并注释掉
setContentOffset
行)