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。这样就能够被检測到。

  • 相关阅读:
    我的第二个裸板程序之链接地址与存储地址
    ARM你必须知道的事儿——为啥“PC = PC + 8”?
    typedef你真的理解么?
    centos使用--vsftpd配置
    centos使用--zsh
    laravel5.2总结--序列化
    laravel5.2总结--csrf保护
    laravel5.2总结--任务调度
    laravel5.2总结--本地化以及常量的使用
    laravel5.2总结--文件上传
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7000436.html
Copyright © 2011-2022 走看看