zoukankan      html  css  js  c++  java
  • NStimer 被堵塞

    我们在界面上滚动一个scrollview,那么我们会发如今停止滚动前,会发现NSTimer未被运行。就好像scrollView在滚动的时候将timer暂停了一样,在查看对应文档后发现,这事实上就是runloop的mode在做怪。


    runloop能够理解为cocoa下的一种消息循环机制,用来处理各种消息事件。我们在开发的时候并不须要手动去创建一个runloop。由于框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们能够得到一个当前线程以下相应的runloop对象。只是我们须要注意的是不同的runloop之间消息的通知方式。

    接着上面的话题,在开启一个NSTimer实质上是在当前的runloop中注冊了一个新的事件源,而当scrollView滚动的时候。当前的MainRunLoop是处于UITrackingRunLoopMode的模式下,在这个模式下,是不会处理NSDefaultRunLoopMode的消息(由于RunLoop Mode不一样),要想在scrollView滚动的同一时候也接受其他runloop的消息。我们须要改变两者之间的runloopmode.

    
    

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(printMessage:)
                                                userInfo:nil repeats:YES];

    	[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    }

    简单的说就是NSTimer不会开启新的进程,仅仅是在Runloop里注冊了一下。Runloop每次loop时都会检測这个timer,看能否够触发。当Runloop在A mode。而timer注冊在B mode时就无法去检測这个timer。所以须要把NSTimer也注冊到A mode。这样就能够被检測到。

  • 相关阅读:
    设置N秒后执行某个方法或函数
    3D Touch的简单使用
    iOS app 上架的流程与注意点
    使用ueditor时候修改图片路径及其相关信息
    给某个view增加颜色渐变图层
    文字冒泡效果
    iOS获取设备型号、设备类型等信息
    “匿名内部类”的使用场合举例
    TreeSet之用外部比较器实现自定义有序(重要)
    TreeSet的运用之使用内部比较器实现自定义有序(重要)
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7000436.html
Copyright © 2011-2022 走看看