二,何时使用Run Loop
对于辅助线程,在需要和线程有更多交互时,才使用Run Loop。
比如:1)使用端口或者自定义输入源来和其他线程通讯
2)使用线程定时器
3)Cocoa中使用任何performSelector...的方法(参考Table:Performing selectors on other threads)
4)使线程周期性工作
三,如何使用Run Loop对象
Run Loop对象提供了添加输入源,定时器和Run Loop的观察者以及启动Run Loop的接口,使用Run Loop包活获取--配置--启动--退出四个过程
1,获取Run Loop的对象
A,通过NSRunLoop获取
// 获得当前thread的Run loop
NSRunLoop *myRunLoop = [NSRunLoop currentRunLoop];
// 将Cocoa的NSRunLoop类型转换程Core Foundation的CFRunLoopRef类型
CFRunLoopRef ç = [myRunLoop getCFRunLoop];
B,使用CFRunLoopGetCurrent()函数
2,配置Run Loop
所谓配置Run Loop主要是给Run Loop添加输入源,定时器或者添加观察者,即设置Run Loop模式。上面函数- (void)observerRunLoop就是配置了一个带有观察者,添加了一个定时器的Run Loop线程。相关对象---CFRunLoopObserverRef对象和CFRunLoopAddObserver函数
3,启动Run Loop
一个Run Loop通常必须包含一个输入源或者定时器来监听事件,如果一个都没有,Run Loop启动后立即退出。
启动Run Loop的方式
1)无条件的---最简单的启动方法,但是退出Run Loop的唯一方式就是杀死它。
2)设置超时时间---预设超时时间来运行Run Loop。Run Loop运行直到某一事件到达或者规定的时间已经到期。
A,如果是事件到达,消息被传递给相应的处理程序来处理,然后Run Loop退出。可以循环重启Run Loop来等待下一事件。
B,如果是规定的时间到期了,可以使用此段时间来做任何的其他工作,然后Run Loop退出,或者直接循环重启Run Loop。
3)特定模式
使用特定模式运行Run Loop
=====Running a run loop: skeleton
- (void)skeletonThreadMain
{
BOOL done = NO;
// Set up a autorelease pool here if not using garbage collection.
.........
// Add Sources/Timers to the run loop  and do any other setup
.........
// The cycle of run loop
do
{
// start  the run loop but return after each source is handled
SInt32 result = CFRunLoopRunInMode( kCFRunLoopDefault, 10, YES );
// if a source explicitly stopped the run loop, or if there are no sources or timers, go ahead and exit.
if( (result == kCFRunLoopRunStopped) || (result == kCFRunLoopRunFinished) )
done = YES;
// Check for any other exit conditions here and set the "done" variable as needed
.........
}while(!done)
// Clean up code here. Be sure to release any allocated autorelease pools
.........
}
注:可以递归运行Run Loop,即可以使用CFRunLoopRun,CFRunLoopRunInMode或者任一NSRunLoop的方法在输入源或者定时器的处理程序里面启动Run Loop
4,退出Run Loop
有两种方法可以让Run Loop在处理事件之前退出
A,给Run Loop设置超时时间
B,通知Run Loop停止---使用CFRunLoopStopped函数可以显式停止run loop
5,线程安全和Run Loop对象
NSRunLoop线程不安全
CFRunLoop线程安全
对Run Loop对象的修改尽可能在所有线程内部完成这些操作

IOS 多线程 RUNLOOP 机制 (二)相关推荐

  1. iOS多线程编程之NSThread的使用(★★★推荐,为原作者点赞★★★)

    文章来源:http://blog.csdn.net/totogo2010/article/details/8010231 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThre ...

  2. iOS多线程:『NSOperation、NSOperationQueue』详尽总结

    2019独角兽企业重金招聘Python工程师标准>>> iOS多线程:『NSOperation.NSOperationQueue』详尽总结 转载: 原地址https://www.ji ...

  3. iOS面试题总结 二

    1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答:Object-c的类不可以多重继承;可以实现多个接口,通过实现多 ...

  4. 【面试】iOS 开发面试题(二)

    [面试]iOS 开发面试题(二) 1. 我们说的oc是动态执行时语言是什么意思? 答案:多态. 主要是将数据类型的确定由编译时,推迟到了执行时. 这个问题事实上浅涉及到两个概念.执行时和多态. 简单来 ...

  5. 【iOS】—— RunLoop详解

    目录 一.Runloop概述 Runloop基本作用 Runloop伪代码 Runloop模型图 二.Runloop对象 Runloop对象的获取 _CFRunLoopGet0方法 Runloop与线 ...

  6. ios内存管理机制基础

    采用引用计数的方式来管理内存,分MRC和ARC两种,其中ARC是基于MRC的. 在MRC中, 每当我们使用alloc,new,retain,copy使对象的引用计数增加,都要对应的使用release或 ...

  7. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)

    2017-07-08 remember17 Cocoa开发者社区 目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 ...

  8. iOS多线程开发之GCD(基础篇)

    总纲: GCD基本概念 GCD如何实现 GCD如何使用 队列和任务组合 一.GCD基本概念 GCD 全称Grand Central Dispatch(大中枢队列调度),是一套低层API,提供了⼀种新的 ...

  9. Java多线程闲聊(二):活锁和死锁

    Java多线程闲聊(二):活锁和死锁 这两个情况其实都是应该需要避免的情况,为了便于自己的回顾,我还是希望通过尽可能简单的表达来进行简要的归纳. 何谓死锁,就是正正紧紧按照Java的规范进行编程依然会 ...

最新文章

  1. 优秀的 Java 项目是如何分层的?
  2. Neutron — VLAN aware VMs 与 VLAN transparent
  3. 中小企业网络管理技术完全篇
  4. OpenCV3.4.3DNN 模块中sample-colorization、Easy-textdetector、openpose
  5. CS229——线性回归
  6. Linux 词典安装
  7. 高阶函数 map,reduce, filter的用法
  8. C语言关键字详解(五)带你全面了解 volatile 关键字
  9. Altium Designer数码管字体、镂空字体
  10. 使用Clustal进行多序列比对
  11. 蒙特卡洛_蒙特卡洛辍学
  12. Vue基础语法知识(自用,完整版)
  13. java程序员秃顶,【本人秃顶程序员】使用Azure Function + Cognitive Services 实现图片自动化审核...
  14. 虚拟机安装华为模拟器eNSP过程中所遇问题与解决办法
  15. Ubuntu18.04系统备份与恢复软件推荐——Systemback
  16. 去中心化借贷协议Trister’s Lend全面内测并提交合约代码安全审计
  17. 深度学习入门,计算机视觉,推荐系统,自然语言处理理论框架以及学习资料【附知识图谱与链接】
  18. 阻容感基础11:电感器应用(终结篇)
  19. c++ 学习笔记(高级linux编程) day7
  20. postgre创建存储过程_postgre 存储过程

热门文章

  1. 搜索引擎的相关词提示
  2. linux 硬盘分区与格式化挂载 (二)
  3. 一对多分页的SQL应该怎么写?
  4. ARM单片机的嵌入式工控机主板功能应用
  5. c4d r23快捷键偏好留档
  6. C4D R23-R19 安装包(winmac)安装教程及资源文件
  7. 【MM2020】【lip generation】A Lip Sync Expert Is All You Need for Speech to Lip Generation In The Wild
  8. 程序员为什么不去考公务员?
  9. 新版Edge浏览器安装外部扩展(.crx)的方法
  10. 智慧城市-智慧城管系列-2-人流统计-PaddleDetection