- (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate 方法 详解
来源:互联网 发布:sql 2008 创建视图语句 编辑:程序博客网 时间:2024/04/30 22:44
在单线程的app中,不需要注意Run Loop,但不代表没有。程序启动时,系统已经在主线程中加入了Run Loop。它保证了我们的主线程在运行起来后,就处于一种“等待”的状态(而不像一些命令行程序一样运行一次就结束了),这个时候如果有接收到的事件(Timer的定时到了或是其他线程的消息),就会执行任务,否则就处于休眠状态。
如果我们要写多线程的程序,可能就需要自己来管理Run Loop。
下面说一下楼主提出的方法中的参数:
RunMode: NSDefaultRunLoopMode,可以把这个理解为一个”过滤器“,我们可以只对自己关心的事件进行监视。一般NSDefaultRunLoopMode是最常用的。
启动run loop的方法就是lz写的这个,它的说明如下:
Runs the loop once, blocking for input in the specified mode until a given date.
启动run loop一次,在特定的run loop mode下等待输入。
如果没有附加input source或是timer,或是过limitDate,run loop就会退出,并且方法返回NO。
- -(void)getServer:(NSDictionary *)userInfo
- //-(void)getIMMessageServer:(NSString *)ip Port:(NSString *)port
- {
- NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@/Services/AccessGate/?tag/im", ip,port]];
- NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
- NSURLConnection *theConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self] autorelease];
- while (!finished) {
- [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
- }
- [pool release];
- }
我们可以一直去请求一个文件,只到我们获取到文件为止,即finished==yes
下来是Run Loop的使用场合:
1. 使用port或是自定义的input source来和其他线程进行通信
2. 在线程(非主线程)中使用timer
3. 使用 performSelector...系列(如performSelectorOnThread, ...)
4. 使用线程执行周期性工作
大家也可以看下下面的例子
while(done)
{
[ NSRunLoop currentRunLoop] runMode:currentMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];
}
上面这段话看似程序进入了死循环,其实并不是这样。
这段程序的意思是:
如果当前线程有当前设置的runMode下的事件发生,runloop就会启动,处理对应的事件。如果没有事件发生,runloop就会每过10秒钟启动一次当前线程的runloop.
如果runloop每次启动成功 [ NSRunLoop currentRunLoop] runMode:currentMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]]; 返回值为YES,这个启动成功包括了时间触发和10秒钟到了之后触发两种情况。如果启动失败返回false.
说到这个地方可能还不明白,为什么要搞个循环,为什么要用runloop,我刚开始的时候也是搞得不太明白。
这个地方解释一下:
当我们在ios设备上面触摸屏幕之后,对应的tounch事件就会调用,这是为什么呢,其实这个地方就有runloop的功劳。
其实runloop做为一种时间处理机制,类似一个车间的主任(不知道这种比喻是否恰当),这个主任他负责处理这个车间流水线上面发生特定类型事件的处理(这里的特定事件就是runMode)这个事件可以包括安全事件,机械时间等等。该主任处理时间的传统方式可以是每隔一分钟巡逻生产线一次(对应的是cpu空转轮询消息队列的方式),这种方式比较耗费工人体力(cpu资源,电量),当发现有问题发生,他就找对应的工人去处理,这里的工人对应于时间的处理函数;还有一种方式就是主任平时都在睡觉打麻将,当生产线发生问题的时候,如果是属于他的职责,系统就直接给他发送一条短信通知他,他收到之后再通知对应的工人去处理,上面那个十秒钟(这个是可以更改的)就是如果十秒内没有消息通知过来,主任才会去车间巡逻一次,但是这十秒由于主任是没有收到事件处理消息的,所以他通常是到了车间就走了(对应runLoop启动就结束,没有事件处理)。
因此采用runloop的好处就显而易见了。
- - (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate 方法 详解
- - (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate 方法 详解
- NSString VS NSDate (转换详解)
- NSString NSDate NSArray常用方法
- NSString 、NSArray、NSDate NSDictionary常用方法
- NSDate&NSString
- NSDate 格式化 NSDate to NSString
- NSString方法compare详解
- NSString方法compare详解
- NSString方法compare详解
- NSString方法compare详解
- NSString compare方法详解
- NSString方法compare详解
- NSString 转换 NSdate
- NSString 转 NSDate
- NSDate与NSString转换
- NSDate NSString 互相转换
- NSDate与NSString转换
- OSGEARTH视频教程31讲学习,解决osgEARTH水平看太黑的问题
- iOS应用开发(五) 视图控制器生命周期
- 架构师速成4.1-幼儿园要学会如何学习(转载自36氪)
- 【to be continue】五金配件,省得以后不认识
- dumpsys meminfo 说明
- - (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate 方法 详解
- 游戏设计场景探秘之反转时刻
- 解决32位Eclipse和64位Eclipse在64位win7系统上运行问题
- Linux 环境变量与文件查找
- neutron-openvswitch-agent crash error!
- IIS 服务或万维网发布服务,或者依赖这 服务可能在启动期间发生错误或者已禁用
- MySQL入门书籍和方法分享
- 视频教程32讲学习,线模式
- “自释放”在iOS开发中的应用