Runtime timer

转载 2015年07月09日 17:15:11

在Windows时代,大家肯定对SendMessage,PostMessage,GetMessage有所了解,这些都是windows中的消息处理函数,那对应在ios中是什么呢,其实就是NSRunloop这个东西。在ios中,所有消息都会被添加到NSRunloop中,分为‘input source’跟'timer source'种,并在循环中检查是不是有事件需要发生,如果需要那么就调用相应的函数处理。

我们在使用NSTimer的时候,可能会接触到runloop的概念,下面是一个简单的例子:

复制代码
 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     // Do any additional setup after loading the view, typically from a nib.
 5     NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1
 6                                               target:self
 7                                             selector:@selector(printMessage:)
 8                                             userInfo:nil
 9                                              repeats:YES];
10 }
复制代码

这个时候如果我们在界面上滚动一个scrollview,那么我们会发现在停止滚动前,控制台不会有任何输出,就好像scrollView在滚动的时候将timer暂停了一样,在查看相应文档后发现,这其实就是runloop的mode在做怪。
runloop可以理解为cocoa下的一种消息循环机制,用来处理各种消息事件,我们在开发的时候并不需要手动去创建一个runloop,因为框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们可以得到一个当前线程下面对应的runloop对象,不过我们需要注意的是不同的runloop之间消息的通知方式。

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

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

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

说到这里,在http异步通信的模块中也有可能碰到这样的问题,就是在向服务器异步获取图片数据通知主线程刷新tableView中的图片时,在tableView滚动没有停止或用户手指停留在屏幕上的时候,图片一直不会出来,可能背后也是这个runloop的mode在做怪,嘿嘿。

java中Runtime的使用

1.Runtime类封装了运行时环境。用户一般不实例化一个Runtime对象,但是可以通过调用静态方法Runtime.getRuntime()来获得对当前Runtime对象的引用。一旦获得了对当前对象...
  • zhengqiqiqinqin
  • zhengqiqiqinqin
  • 2013年06月15日 17:58
  • 1189

让服务不再停止(在Windows Service中使用Timer的技巧)

平时在开发中,经常遇到的一个需求就是,要开发一个后台的程序,来监视数据库中某些数据的变化,并且发生变化以后要立刻做出响应。 实际上呢,我们会建立一个Windows Service工程,在里面放一...
  • lvjin110
  • lvjin110
  • 2013年12月14日 23:03
  • 1278

OC_runtime运行时官方文档翻译

Objective-C的运行时参考 配套指南 Objective-C的运行时编程指南 在宣布 IONDRVLibraries.h  NSObjCRuntime.h  objc ...
  • liangliang103377
  • liangliang103377
  • 2014年09月02日 16:03
  • 12981

runtime(二) 修改和添加属性

改变成员变量 (void)getIvarList { unsigned int count = 0; // 1. 获取某个类的成员变量列表 Ivar *ivarList = c...
  • squallmouse
  • squallmouse
  • 2016年05月30日 16:34
  • 1761

Objective-C Runtime的基本使用(iOS Runtime的初体验)

一、Runtime前言搞懂Runtime好像很难,需要一些底层基础,我看了好久,也才懂得一些些,这里做一个笔记,OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类的对象相应的方法。利用...
  • yj229201093
  • yj229201093
  • 2016年06月03日 14:10
  • 3787

runtime从入门到精通(三)—— runtime常用接口方法

继续学习runtime,上一篇文章http://blog.csdn.net/coyote1994/article/details/52441513我把苹果关于runtime的官方文档翻译了下。下面我们...
  • coyote1994
  • coyote1994
  • 2016年09月06日 16:38
  • 1865

runtime从入门到精通(六)—— runtime在实际开发中的应用

上一篇文章,我们学习了runtime的消息发送和消息转发机制(查看链接: runtime从入门到精通(五)—— 消息发送和消息转发 ),倒到此为止,有关runtime的理论知识介绍就先告于段落,小伙伴...
  • coyote1994
  • coyote1994
  • 2016年09月08日 12:08
  • 2100

Runtime之概念,功能和怎么使用

Runtime前言虽然作者接触ios开发有1年半的时间了,但是对runtime的理解还有有些压力的,毕竟太抽象的东西,再开发中也是很少用到的,网上有太多的解析Runtime的文章,大多都是解释得有点难...
  • u012400600
  • u012400600
  • 2016年05月22日 20:21
  • 489

Java多线程总结(3)— Timer 和 TimerTask深入分析

1. 基本概念  java.util.Timer:是一个实用工具类,该类用来调度一个线程(schedule a thread),使它可以在将来某一时刻执行。 Java的Timer类可以调度一个任务运行...
  • Mark_LQ
  • Mark_LQ
  • 2015年12月15日 22:31
  • 2877

iOS runtime 学习分享

这是团队小伙伴在内部的一次技术分享, 很开心, 我们团队越来越好了.iOS runtime 学习分享Author:Liao Zusheng申明: 部分资料来自于知名论坛和博客,已在文中给出相关源连接 ...
  • uxyheaven
  • uxyheaven
  • 2015年12月18日 09:25
  • 2759
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Runtime timer
举报原因:
原因补充:

(最多只允许输入30个字)