美文网首页iOS开发(OC)ios面试知识复习
tableView或者scrollView滑动时 定时器 不响应

tableView或者scrollView滑动时 定时器 不响应

作者: 枫叶知秋 | 来源:发表于2016-07-27 17:01 被阅读479次

    先写解决办法

    1.

    NStimer * timer =[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer:) userInfo:nil repeats:YES];
    
    将定时器加入到循环机制中
    [[NSRunLoop mainRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];
    

    2.

    使用GCD创建定时器。GCD创建定时器不收Runloop的影响,并且GCD的定时器更精准。

    原因

    1.当tableView和scrollView滑动的时候 定时器的时间不响应 是苹果的响应机制的原因

    详解看http://blog.csdn.net/meegomeego/article/details/48547583

    2.有关NSTimer的创建方式,NSTimer的创建方法有两种

    NSTimer * timer = [NSTimerscheduled TimerWithTimeInterval:1.0f target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    
    或者
    
    NSTimer * timer =  [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    

    注意: 1.使用NSTimerscheduled 的初始化方法将以默认mode(NSDefaultRunLoopMode)直接添加到runloop中

    2.不用scheduled方式初始化的,需要手动addTimer:forMode:将timer添加到一个runloop中(一般也会将Mode设置为NSDefaultRunLoopMode)。


    关于runloop的知识:其实就是runloop的mode在做怪。runloop可以理解为cocoa下的一种消息循环机制,用来处理各种消息事件,我们在开发的时候并不需要手动去创建一个runloop,因为框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们可以得到一个当前线程下面对应的runloop对象,不过我们需要注意的是不同的runloop之间消息的通知方式。在开启一个NSTimer或CADisplayLink实质上是在当前的runloop中注册了一个新的事件源,而当scrollView滚动的时候,当前的MainRunLoop是处于UITrackingRunLoopMode的模式下,在这个模式下,是不会处理NSDefaultRunLoopMode的消息(因为RunLoop Mode不一样),要想在scrollView滚动的同时也接受其它runloop的消息,就不能将Mode参数设置为

    NSDefaultRunLoopMode,而应该设置为NSRunLoopCommonModes

    参考网址:

    1.http://blog.csdn.net/huxinguang_ios/article/details/51045810
    2.http://my.oschina.net/u/2340880/blog/398598

    相关文章

      网友评论

        本文标题:tableView或者scrollView滑动时 定时器 不响应

        本文链接:https://www.haomeiwen.com/subject/ravojttx.html