转载iOS--->RunLoop

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

前一个月自认为把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;
}

时间: 2024-08-11 00:40:50

转载iOS--->RunLoop的相关文章

转载 IOS开发之---static变量

Objective-C 支持全局变量 主要有两种实现方式: (1)第一种和C/C++中的一样, 使用"extern"关键词: (2)另外一种就是使用单例实现. (比如我们经常会把一个变量放在AppDelegate里面作为全局变量来访问, 其中AppDelegate就是一个单例类)  在Objective-C中如何实现像C++中那样的静态成员变量呢? 你需要做的是在一个类A的implementation(.m或者.mm)文件中定义一个static变量,然后为A类定义静态成员函数(clas

[转载]IOS开发之----strong和weak (IOS5新特性)

iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新关键字与a

[转载]ios 开发 icon图标设置

iTunes Artwork icon ───────────────────────── 512px (90px) App icon(iPhone4) ────────────────────────── 114px (20px) App icon(iPad) ───────────────────────────── 72px (12px) App icon(iPhone 3G/3GS) ───────────────────── 57px(10px) Spotlight/Settings

[转载]iOS面试题总

转载自:http://blog.sina.com.cn/s/blog_67eb608b0101r6xb.html (2014-06-13 20:23:33) 转载▼ 标签: 转载   crash 原文地址:iOS面试题总作者:唯一的弟子 1.简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonato

iOS RunLoop了解和使用

RunLoop 上次讲了runtime,这次是runloop,虽然两者都是run开头的名词术语,但是在OC中,这两个东西压根没啥联系.这篇文章主要讲讲runloop的一些概念和用法.其中包含: 什么runloop runloop是怎么存在的 runloop中包含哪些东西 日常开发中使用到runloop 的场景 一.什么是runloop 一个很容易想到的现象: 当我们将手机解锁进入某个APP之后,如果不操作手机(包括网络请求的行为),手机不会有任何反应,一旦我们进行了操作的时候,手机就会执行响应的

iOS runloop详解

写这篇文章开始之前,我都不知道runloop是什么东西,如果从字面的意思翻译应该是一直循环的跑,怀疑可能和死锁有关系,可是死锁具体是怎么回事,我只是记得有这个说法,也发现了一个自己不懂的知识. 初识runloop 我在网上看了一下@sunnnyxx 关于runloop的视频.了解了一下runloop相关知识,也去网络上看各种关于runloop的讲述. 我们一般程序就是执行一个线程,是一条直线,有起点终点,而runloop就是一直在线程上面画圆圈,一直在跑圈,除非切断否则一直在运行.网上说的比喻很

iOS runloop 资源汇总-b

RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利用 RunLoop 实现自动释放池.延迟回调.触摸事件.屏幕刷新等功能的. 1.先来一发,孙源大神的讲解视频:http://v.youku.com/v_show/id_XODgxODkzODI0.html(亮点:讲解通俗易懂,理解深刻) 2.孙源大神原文博客:http://www.code4app.

ios Runloop

一.概念:一个Runloop就是一个事件处理的循环,用来不停的调度工作和处理输入事件,使用runloop的目的是让你的线程在有工作的时候处于工作状态,没有工作的时候处于休眠状态. 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出.如果我们需要一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的: 1 2 3 4 5 6 7 function loop() {     initialize();     do {         var message = get_nex

iOS Runloop理解

一.RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统. Foundation: NSRunLoopCore Foundation: CFRunLoop 核心部分,代码开源,C 语言编写,跨平台 二.目的 通过RunLoop机制实现省电,流畅,响应速度快,用户体验好 三.理解 进程是一家工厂,线程是一个流水线,Run Loo

[转载]iOS开发之手势识别

感觉有必要把iOS开发中的手势识别做一个小小的总结.在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextView中的手是用storyboard添加的.下面会先给出如何用storyboard给相应的控件添加手势,然后在用纯代码的方式给我们的控件添加手势,手势的用法比较简单.和button的用法类似,也是目标动作回调,话不多说,切入今天的正题.总共有六种手势识别:轻击手势(TapGestureRecogniz