也来谈谈CFRunLoop(NSRunLoop)(含demo)

iOSCFRunLoopNSRunLoop 

说来,我忘东西还真是飞快。

前一个月自认为把RunLoop研究得比较透彻了,但因为没有在项目中实际使用的缘故,到现在竟然都快忘了,我必须得把它记录下来,以后忘记了我还可以在这里找回来再看看。

 

下面是测试代码:

 

 

Js代码  

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.       
  5.     //这里偷个懒,直接使用performSelectorInBackground来创建一个线程,并执行configRunLoop方法  
  6.     [self performSelectorInBackground:@selector(configRunLoop) withObject:nil];  
  7.       
  8.     UIButton* __button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
  9.     [__button1 setTitle:@"Fire Event" forState:UIControlStateNormal];  
  10.     //触发事件启动RunLoop  
  11.     [__button1 addTarget:self action:@selector(triggerEvent) forControlEvents:UIControlEventTouchUpInside];  
  12.     __button1.frame = CGRectMake(0, 0, 100, 80);  
  13.     [self.view addSubview:__button1];  
  14.       
  15.       
  16.     UIButton* __button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
  17.     [__button2 setTitle:@"Stop RunLoop" forState:UIControlStateNormal];  
  18.     //RunLoop周期完成后自动退出线程  
  19.     [__button2 addTarget:self action:@selector(stopRunloop) forControlEvents:UIControlEventTouchUpInside];  
  20.     __button2.frame = CGRectMake(110, 0, 120, 80);  
  21.     [self.view addSubview:__button2];  
  22. }  
  23.   
  24. - (void)stopRunloop{  
  25.     _shouldStop = YES;  
  26. }  
  27.   
  28. - (void)triggerEvent{  
  29.     if (CFRunLoopIsWaiting(_runLoopRef)) {  
  30.         NSLog(@"RunLoop 正在等待事件输入");  
  31.         //添加输入事件  
  32.         CFRunLoopSourceSignal(_source);  
  33.         //唤醒线程,线程唤醒后发现由事件需要处理,于是立即处理事件  
  34.         CFRunLoopWakeUp(_runLoopRef);  
  35.     }else {  
  36.         NSLog(@"RunLoop 正在处理事件");  
  37.         //添加输入事件,当前正在处理一个事件,当前事件处理完成后,立即处理当前新输入的事件  
  38.         CFRunLoopSourceSignal(_source);  
  39.     }  
  40. }  
  41.   
  42. //此输入源需要处理的后台事件  
  43. static void fire(void* info __unused){  
  44.     NSLog(@"我现在正在处理后台任务");  
  45.     sleep(5);  
  46. }  
  47.   
  48. - (void)configRunLoop{  
  49.     //这里获取到的已经是某个子线程了哦,不是主线程哦  
  50.     _tThread = [NSThread currentThread];  
  51.     //这里也是这个子线程的RunLoop哦  
  52.     _runLoopRef = CFRunLoopGetCurrent();  
  53.       
  54.     bzero(&_source_context, sizeof(_source_context));  
  55.     //这里创建了一个基于事件的源  
  56.     _source_context.perform = fire;  
  57.     _source = CFRunLoopSourceCreate(NULL, 0, &_source_context);  
  58.     //将源添加到当前RunLoop中去  
  59.     CFRunLoopAddSource(_runLoopRef, _source, kCFRunLoopCommonModes);  
  60.       
  61.       
  62.     while (!_shouldStop) {  
  63.         NSLog(@"RunLoop 开始运行");  
  64.         //每次RunLoop只运行10秒,每10秒做一次检测,如果没有需要处理的后台任务了,就让此线程自己终止,不用暴力Kill  
  65.         CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, NO);  
  66.         NSLog(@"RunLoop 停止运行");  
  67.     }  
  68.     _tThread = nil;  
  69. }  

 

 

这里是更详细的说明和解释

 

附件是Demo的完整代码

http://modun.iteye.com/blog/1600588
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值