美文网首页
NSRunloop的简单认识

NSRunloop的简单认识

作者: 爬山的奥特曼 | 来源:发表于2017-06-13 09:05 被阅读0次

- (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];

}

如果我们同时在界面上滚动一个scrollview,那么我们会发现在滚动停止之前,控制台是不会有输出的,就好像scrollView在滚动的时候将timer暂停了一样。通过了解后发现,其实是Cocoa的RunLoop Mode在作怪。

我把runloop理解为一种cocoa下的一种消息循环的机制,用来处理各种消息事件。我们在开发的时候一般并不需要手动去创建一个runloop,因为在程序进入mainThread之后其实就为我们创建了默认的的mainRunLoop,通过[NSRunloop currentRunLoop]我们就可以得到当前线程对应的RunLoop对象,而我们需要留意的是在多个runloop之间消息的通知方式。

接上面说到的,开启一个NSTimer实质上是开启了一个新的线程(Runloop)在当前Runloop中注册了一个新的事件源,也就是说除了MainRunloop之外还有一个Runloop存在。而当scrollView在滚动的时候,当前MainRunLoop是处于UITrackingRunLoopMode,在该模式下,不会处理 NSDefaultRunLoopMode的消息(因为Runloop Model不一致),而NSTimer在创建后的RunLoop(B)默认会以NSDefaultRunLoopMode与当前context的Runloop(A)发送消息进行通信。要想在scrollView滚动的同时也接受其他runloop的消息,则需要改变两者之间的RunLoopMode

[[NSRunLoop currentRunLoop] addTimer:timer

forMode:NSRunLoopCommonModes];

类似的问题在前几天修改一个http异步通信模块的时候也碰到了,简单地说是向服务器异步获取图片数据后通知主线程刷新tableView中的图片,但在tableView滚动还没有停止或用户手指还停留在屏幕上的时候,图片一直不会出来。后来发现请求数据的时候用到了NSURLConnection的

- (id)initWithRequest:(NSURLRequest *)request

delegate:(id)delegate;

了解后发现该方法创建的异步请求线程和NSTimer一样,也是NSDefaultRunLoopMode的,与

- (id)initWithRequest:(NSURLRequest *)request

delegate:(id)delegate

startImmediately:(BOOL)startImmediately

不同的是,上面的方法默认创建后默认直接发起请求,并以NSDefaultRunLoopMode与runloop进行消息传递,因此我们需要和NSTimer一样更改他的RunLoopMode。

NSURLConnection *connection = [[NSURLConnection alloc]

initWithRequest:request

delegate:self

startImmediately:NO];

[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]

forMode:NSRunLoopCommonModes];

[connection start];

相关文章

  • NSRunloop的简单认识

    - (void)viewDidLoad { [super viewDidLoad]; // Do any addi...

  • NSRunloop 认识

    timer和runloop runloop的模式分为5种 系统默认定义了多种运行模式(CFRunLoopModeR...

  • 认识NSRunLoop

    看过很多NSRunLoop的讲解,很枯燥,扯理论,真的不容易理解NSRunLoop其实就像是个监听器。。检查输入源...

  • NSRunloop 简单细说

    NSRunloop简单细说(一)—— 整体了解NSRunloop简单细说(二)—— 获取运行循环及其模式NSRun...

  • NSRunLoop认识(二)

    一.这里先提一点 : NSRunloop 的执行流程 二.网上找的伪代码 三.Source Source 包含 :...

  • NSRunLoop认识(一)

    一.NSRunloop的基本认识 主线程Runlopp 从App开启,就一直存在(在main函数中初始化). 主线...

  • NSTimer中的NSRunloop

    NSTimer与NSRunloop平时的运用 一, 简单的了解NSRunloop 从字面上看:运行循环、跑圈 其实...

  • NSRunLoop的使用

    版本:iOS13.6 本文仅介绍api的作用若想了解NSRunloop,可点击NSRunloop 简单细说。若想了...

  • NSRunLoop的简单介绍

    NSRunLoop核心内容很多,这里仅结合自己实际开发遇到的情况,参考相关博客,给出自己的一点理解。主要是NSTi...

  • NSRunLoop作用

    NSRunLoop是IOS消息机制的处理模式 NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和...

网友评论

      本文标题: NSRunloop的简单认识

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