`
modun
  • 浏览: 148374 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

也来谈谈CFRunLoop(NSRunLoop)

    博客分类:
  • IOS
阅读更多

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

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

 

下面是测试代码:

 

 

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //这里偷个懒,直接使用performSelectorInBackground来创建一个线程,并执行configRunLoop方法
    [self performSelectorInBackground:@selector(configRunLoop) withObject:nil];
    
    UIButton* __button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [__button1 setTitle:@"Fire Event" forState:UIControlStateNormal];
    //触发事件启动RunLoop
    [__button1 addTarget:self action:@selector(triggerEvent) forControlEvents:UIControlEventTouchUpInside];
    __button1.frame = CGRectMake(0, 0, 100, 80);
    [self.view addSubview:__button1];
    
    
    UIButton* __button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [__button2 setTitle:@"Stop RunLoop" forState:UIControlStateNormal];
    //RunLoop周期完成后自动退出线程
    [__button2 addTarget:self action:@selector(stopRunloop) forControlEvents:UIControlEventTouchUpInside];
    __button2.frame = CGRectMake(110, 0, 120, 80);
    [self.view addSubview:__button2];
}

- (void)stopRunloop{
    _shouldStop = YES;
}

- (void)triggerEvent{
    if (CFRunLoopIsWaiting(_runLoopRef)) {
        NSLog(@"RunLoop 正在等待事件输入");
        //添加输入事件
        CFRunLoopSourceSignal(_source);
        //唤醒线程,线程唤醒后发现由事件需要处理,于是立即处理事件
        CFRunLoopWakeUp(_runLoopRef);
    }else {
        NSLog(@"RunLoop 正在处理事件");
        //添加输入事件,当前正在处理一个事件,当前事件处理完成后,立即处理当前新输入的事件
        CFRunLoopSourceSignal(_source);
    }
}

//此输入源需要处理的后台事件
static void fire(void* info __unused){
    NSLog(@"我现在正在处理后台任务");
    sleep(5);
}

- (void)configRunLoop{
    //这里获取到的已经是某个子线程了哦,不是主线程哦
    _tThread = [NSThread currentThread];
    //这里也是这个子线程的RunLoop哦
    _runLoopRef = CFRunLoopGetCurrent();
    
    bzero(&_source_context, sizeof(_source_context));
    //这里创建了一个基于事件的源
    _source_context.perform = fire;
    _source = CFRunLoopSourceCreate(NULL, 0, &_source_context);
    //将源添加到当前RunLoop中去
    CFRunLoopAddSource(_runLoopRef, _source, kCFRunLoopCommonModes);
    
    
    while (!_shouldStop) {
        NSLog(@"RunLoop 开始运行");
        //每次RunLoop只运行10秒,每10秒做一次检测,如果没有需要处理的后台任务了,就让此线程自己终止,不用暴力Kill
        CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, NO);
        NSLog(@"RunLoop 停止运行");
    }
    _tThread = nil;
}
 

 

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

 

附件是Demo的完整代码

分享到:
评论
1 楼 fqdao 2013-04-25  
请教一个问题。
我现在有一个 建立基于UDP的Socket连接
-(void)openUDPServer{
        //初始化udp
        AsyncUdpSocket *tempSocket=[[AsyncUdpSocket alloc] initWithDelegate:self];
        self.udpSocket=tempSocket;
        [tempSocket release];
   
        NSError *error = nil;
        [self.udpSocket enableBroadcast:YES error:&error];


#pragma mark UDP Delegate Methods
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag
           fromHost:(NSString *)host
               port:(UInt16)port{
           //处理服务端返回的数据。


由于服务端返回的数据很频繁。如果在主线程处理数据肯定是不合理的。今天看你介绍NSRunLoop的用法,是不是我也可以用这种办法。刚对NSRunLoop了解。还不知道怎样使用Inputsorce。望指教,先谢过!

相关推荐

    百度地图开发java源码-iOS_develop_learning_routes:iOS开发学习路线

    CFRunLoop NSRunLoop 数据库 SQLite 网络 TCP UDP DNS解析 HTTP协议 NetworkExtension 网络安全 NSURLSession 证书 iOS基础 UI(控件) Controller(控制器) GestureRecognizer(手势) 布局 Frame AutoLayout ...

    CFRunLoop源码

    NSRunLoop是基于CFRunLoopRef的封装,不是线程安全 CFRunLoopRef的线程安全性:CFRunLoopRef不是在线程刚创建的时候创建的,而是在线程获取的时候创建的,如果不主动获取线程,一直不会有。CFRunLoopRef在创建时通过...

    LightWeightRunLoop-A-Reactor-Style-NSRunLoop, NSRunLoop反应器样式实现.zip

    LightWeightRunLoop-A-Reactor-Style-NSRunLoop, NSRunLoop反应器样式实现 LightWeightRunLoop在其他线程,定时器,URLConnection,LWStream ( LWInputStream、LWOutputStream ),LWPort ( LWSocketPort ) 等上实现 ...

    NSRunLoopDemo

    `NSRunLoop`可以通过设置模式(如`NSDefaultRunLoopMode`或`UITrackingRunLoopMode`)来控制其行为。不同的模式决定哪些源会在特定时间被处理。例如,在视图滚动时,`UIKIT_DURING_VIEW_SCROLL`模式可以防止定时器...

    RunLoop例子

    Run Loop的配置和管理可以通过Objective-C的CFRunLoopRef(Core Foundation层)和NSRunLoop(Foundation层)进行。开发者可以通过添加源(Sources)、观察者(Observers)和端口(Ports)来定制Run Loop的行为,例如...

    RunLoop示例

    通过分析`NSRunLoopTest`的源代码,我们可以学习如何有效地使用`NSRunLoop`、`NSThread`和`Dispatch Queue`来提高应用程序的性能和响应性。这些知识对于开发高效、流畅的iOS和macOS应用至关重要。在实际项目中,合理...

    ios 事件循环原理-runloop

    * 在 VC++ 中,消息处理过程是通过 GetMessage 和 TranslateMessage 函数来实现的,而在 iOS 中,NSRunLoop 负责管理和处理事件。 * 在 VC++ 中,开发者需要自己定义 WM_COMMAND_XXX 这样的宏来标识某个消息,而在 ...

    RunLloop源码

    在苹果的Foundation框架中,RunLoop与Core Foundation框架的CFRunLoop类对应,提供了C语言接口(如CFRunLoop.c和CFRunLoop.h中的定义)和Objective-C的NSRunLoop类。`CFRunLoop`是跨平台的,而`NSRunLoop`是对`...

    7.多线程篇1

    Run Loop的创建与操作:你可以通过`+[NSRunLoop currentRunLoop]`获取当前线程的run loop,或者使用`-[NSRunLoop runMode:beforeDate:]`来控制run loop的执行。 - B. Run Loop的观察者:通过添加观察者(如port、...

    TestRunLoopDemo

    在Thread的NSRunloop中添加进RunLoopSource也是在IOS里面获取常驻线程的一个主要方法手段(开源项目AFNetworking就是用这种手段获取的常驻线程)。从该演示代码我们还可以一窥Objective-C是怎样封装C以提供更加简单...

    06-应用程序1

    在iOS开发中,应用程序的生命周期管理和后台运行能力是至关重要的。本文将深入探讨【标题】"06-应用程序1"中涉及的几个...理解并掌握这些知识点对于iOS开发者来说至关重要,它们是构建功能丰富、高效运行的应用的基础。

    ios-打地鼠 小游戏.zip

    [[NSRunLoop currentRunLoop]addTimer:_timer forMode:NSDefaultRunLoopMode]; 改为: /*每秒刷新60次的定时器*/ _time = [CADisplayLink displayLinkWithTarget:self selector:@selector(play)]; /*将...

    Nsrun loop test

    在macOS中,事件处理主要通过NSRunLoop类来实现。NSRunLoop是一个非常重要的对象,它维护了一个消息循环,处理来自各种源的事件,包括用户交互、定时器以及其他I/O事件。 以下是一个简单的NSRunLoop使用的代码片段...

    DispatchSourceTest.zip

    总结来说,`NSThread`、`NSRunLoop`和`Dispatch Queue`是构建高性能iOS和macOS应用的基础。理解并熟练掌握这些工具,能够帮助开发者编写出更加优雅、高效且易于维护的代码。`DispatchSourceTest.zip`中的代码实例是...

    简单的时间选择器Nstimer

    `NSTimer`是`NSRunLoop`的一部分,它不直接运行在主线程上,而是依赖于运行循环(`NSRunLoop`)来安排和触发事件。创建`NSTimer`时,我们需要指定间隔时间、重复次数、以及一个selector(方法名),当定时器触发时,...

    取消同步的ASIHTTPRequest请求

    在网络访问时,一般都建议用异步访问,但是异步访问的话,需要传入delegate,并处理回调。不利于将所有的网络访问的方法集中到一个类中,所以我采用同步... 以使同步请求也可取消。while循环这段代码在旧版中是没有的。

    RunLoop-线程保活.zip

    5. **控制线程释放**:为了在不再需要线程时正确地释放资源,可以设置RunLoop的超时时间,或者在某个条件满足时手动调用`[[NSRunLoop currentRunLoop] stop]`来结束RunLoop。 在"RunLoop-线程保活"的示例中,开发者...

    ConcurrentCource

    首先,让我们来详细探讨一下NSRunLoop。NSRunLoop是Apple Foundation框架中的一个核心组件,它负责管理事件循环和调度线程。在iOS和macOS应用中,主线程的NSRunLoop主要用于处理用户交互和图形更新。它不断地监听并...

    Runtime-RunLoop:有相应的分析和打印,下载运行视图可以很直观的表现

    相对较多者)作者模块标题卖报的小画家SureMethod Swizzling开发实例汇总滕大鸟最实用的runtime总结黑花白花实际开发中的应用Run LoopsRun Loops 官方文档Run Loops 译文(第三章)CFRunLoop.c 源码CFRunLoop.h 源码...

Global site tag (gtag.js) - Google Analytics