关于消息循环其实一直在用,但是还是不太懂,总结如下:
理论部分:
一个run loop 就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。使用run loop 的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。
Run loop的管理并不完全自动的。你仍然需要设计你的线程代码在合适的时候启动 run loop并正确响应输入事件。你的应用程序不需要显式的创建这些对象(run loop objects);每个线程,包括程序的主线程都有与之对应的run loopobject。
上图显示了run loop 的概念结构以及各种源。输入源传递异步消息给相应的处理例程,并调用runUntilDate:方法来退出(在线程里面相关的NSRunLoop 对象调用)。定时源则直接传递消息给处理例程,但并不会退出run loop;
实践:
self.socket_state = 10;
//当前时间
double nowTime = [[NSDate date] timeIntervalSince1970];
double t2 = nowTime + 12;
//超时 发现状态改变
NSLog(@"消息循环开始");
while (self.socket_state == 10 &&[[NSDate date] timeIntervalSince1970] < t2)
{
NSLog(@"消息循环执行--时间差 %f",t2-[[NSDate date] timeIntervalSince1970] );
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:20]];
}
NSLog(@"阻塞结束");
/*
2014-02-26 14:44:15.954 RunLoopTest[1639:a0b] 消息循环开始
2014-02-26 14:44:15.955 RunLoopTest[1639:a0b] 消息循环执行--时间差 11.998502
2014-02-26 14:44:15.957 RunLoopTest[1639:a0b] 消息循环执行--时间差 11.996921
2014-02-26 14:44:16.173 RunLoopTest[1639:a0b] 消息循环执行--时间差 11.780940
2014-02-26 14:44:36.173 RunLoopTest[1639:a0b] 阻塞结束
*/
self.socket_state = 10;
[self performSelector:@selector(changeValue) withObject:Nil afterDelay:10];
//当前时间
double nowTime = [[NSDate date] timeIntervalSince1970];
double t2 = nowTime + 12;
//超时 发现状态改变
NSLog(@"消息循环开始");
while (self.socket_state == 10 &&[[NSDate date] timeIntervalSince1970] < t2)
{
NSLog(@"消息循环执行--时间差 %f",t2-[[NSDate date] timeIntervalSince1970] );
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:20]];
}
NSLog(@"阻塞结束"); -(void)changeValue
{
self.socket_state = 2;
}
//2014-02-26 14:50:40.851 RunLoopTest[1671:a0b] 消息循环开始
//2014-02-26 14:50:40.852 RunLoopTest[1671:a0b] 消息循环执行--时间差 11.998650
//2014-02-26 14:50:40.854 RunLoopTest[1671:a0b] 消息循环执行--时间差 11.997078
//2014-02-26 14:51:00.001 RunLoopTest[1671:a0b] 阻塞结束
分析:消息循环阻塞当前的代码块,不停的去检查判断条件,当不满足要求的时候,阻塞结束;或者阻塞时间超时,阻塞结束。
在此过程中,此线程可以接收来自button等的点击事件。
也就是告诉计算机在while过程中可以接收哪些输入源的信息。
如果没有消息,循环,计算机,会无限循环,不在接收其他指令。
其他更深层的内容见:
《多线程编程指南 》
多线程需要考虑的东西:
线程安全: 多线程通信 ---- 多线程修改同一个数据----数据同步
线程调度: 工作--- 休眠 --- 工作
线程内存: 自动释放池
多线程管理: 队列