惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
MyScale Blog
MyScale Blog
Cyberwarzone
Cyberwarzone
Schneier on Security
Schneier on Security
I
Intezer
Cisco Talos Blog
Cisco Talos Blog
Cloudbric
Cloudbric
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
NISL@THU
NISL@THU
博客园 - Franky
F
Fortinet All Blogs
Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
T
The Exploit Database - CXSecurity.com
P
Proofpoint News Feed
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
T
Troy Hunt's Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Project Zero
Project Zero
P
Palo Alto Networks Blog
Recorded Future
Recorded Future
美团技术团队
D
Docker
PCI Perspectives
PCI Perspectives
Microsoft Azure Blog
Microsoft Azure Blog
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 最新话题
Recent Announcements
Recent Announcements
Hacker News: Ask HN
Hacker News: Ask HN
人人都是产品经理
人人都是产品经理
月光博客
月光博客
D
DataBreaches.Net
The Hacker News
The Hacker News
爱范儿
爱范儿
V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
SecWiki News
SecWiki News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
A
About on SuperTechFans
Latest news
Latest news
GbyAI
GbyAI
T
Tor Project blog
L
LINUX DO - 热门话题
Security Latest
Security Latest
博客园 - 聂微东
Y
Y Combinator Blog
AI
AI
M
MIT News - Artificial intelligence

Oragekk's Blog

OpenSpec 技术分享:用规格驱动 AI 编程 ChatGPT&Codex订阅教程 一个 waline 评论系统bug引发的思考 Jenkins 远程触发构建踩坑记 Git SSH 密钥配置 初识Rust vuepress-plugin-meting2 谷歌发布多平台应用开发神器Project IDX!PaLM 2加持 Vue常见优化手段 Vue2响应式原理解析 Dart 中的并发 Flutter 工作原理 如何利用GitHub Action提交URL到搜索引擎 提交URL到搜索引擎(百度、Bing、Google) GitHub Actions 使用介绍 素材设计 前端-Q&A 浏览器的事件循环 你不知道的 CSS 之包含块 CSS 属性计算过程 Vercel deploy忽略指定分支 评论插件 Waline 之邮件通知配置 公开API 终端究极美化iTerm2+Pure 使用Bing API提交网站URL Flutter 基础大集合 关于本站 关于本站 关于我 Markdown 展示 使用n命令管理node版本 幻灯片页 ReactNative State(状态) ReactNative开发环境配置,ES6语法介绍 ReactNative介绍 更优雅强大的终端ZSH 神经网络模型训练 YYCache优秀的缓存设计 WebViewJavascriptBridge NSError WCDB漫谈 优雅的实现TableViewCell单选 初探机器学习框架CoreML 深入理解swift中闭包的捕捉语义 ijkPlayer 集成 iOS 配置https iOS timelineLogistics iOS Cookie的配置及使用 WKWebView拦截URL WKWebView使用及自适应高度 textfield限制输入字符 评论系统从多说迁移到disqus指南 利用Runtime进行快速归档 iOS 10.3 keychain 重大更新 Cell的accessoryType属性标记单元格之后,出现的重用问题 通过UserAgent判断设备 AFNetworking A memory leak 一人一句宋词 OC 中的枚举类型 iOS - Image compression algorithm iOS程序启动原理(下) iOS程序启动原理(上) NSOperatioin TableView性能优化 Test Three ways to call Update Cocoapods 1.1.1 减小iOS-App或者静态库体积 Jekyll旧站回忆 JavaScript ES6 CommonJS,RequireJS,SeaJS 归纳笔记 Unix/Linux 扫盲笔记
Runloop
Oragekk · 2016-12-26 · via Oragekk's Blog

Runloop

Runloop 是什么

  • Runloop 是事件接收和分发机制的一个实现。
    • Runloop 提供了一种异步执行代码的机制,不能并行执行任务。
    • 在主队列中,Main RunLoop 直接配合任务的执行,负责处理 UI 事件、定时器以及其他内核相关事件。

###Runloop 的主要目的

  • 保证执行程序的线程不会被终止

###什么时候使用 Runloop

  • 当需要和该线程进行交互的时候才会使用 Runloop

  • 每一个线程都有其对应的 RunLoop,但是默认非主线程的 RunLoop 是没有运行的,需要为 RunLoop 添加至少一个事件源,然后去 run 它。

  • 一般情况下我们是没有必要去启用线程的 RunLoop 的,除非你在一个单独的线程中需要长久的检测某个事件。

  • 主线程 默认有 Runloop。当自己启动一个线程,如果只是用于处理单一的事件,则该线程在执行完之后就退出了。所以当我们需要让该线程监听某项事务时,就得让线程一直不退出,runloop 就是这么一个循环,没有事件的时候,一直卡着,有事件来临了,执行其对应的函数。


Runloop,正如其名所示,是线程进入和被线程用来响应事件以及调用事件处理函数的地方。需要在代码中使用控制语句实现 run loop 的循环,也就是说,需要代码提供 while 或者 for 循环来驱动 run loop。

在这个循环中使用一个 Runloop 对象[NSRunloop currentRunloop]执行接收消息,调用对应的处理函数。

  • Runloop 接收两种源事件:input sourcestimer sources

  • input sources  传递异步事件,通常是来自其他线程和不同的程序中的消息;

  • timer sources(定时器)  传递同步事件(重复执行或者在特定时间上触发)。

  • 除了处理input sources,Runloop 也会产生一些关于本身行为的notificaiton。注册成为 Runloop 的observer,可以接收到这些 notification,做一些额外的处理。(使用CoreFoundation来成为 runloop 的 observer)。

###Runloop 特性

  • 当有事件发生时,Runloop 会根据具体的事件类型通知应用程序作出响应;

  • 当没有事件发生时,Runloop 会进入休眠状态,从而达到省电的目的;

  • 当事件再次发生时,Runloop 会被重新唤醒,处理事件。

  • iOS 中所有的事件监听全部由运行循环负责

  • 主线程的  RunLoop 在应用启动的时候就会自动创建

  • 其他线程则需要在该线程下自己启动

  • 不能自己创建  RunLoop

  • RunLoop 并不是线程安全的,所以需要避免在其他线程上调用当前线程的 RunLoop

  • RunLoop 负责管理  autorelease pools

  • RunLoop 负责处理消息事件,即输入源事件、计时器事件和网络请求事情

###应用场景

  • 创建常驻线程,执行一些会一直存在的任务。该线程的生命周期跟  App
      相同
    @autoreleasepool {
    NSLog(@"%@", [NSThread currentThread]);
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    // 只有添加端口后,才能能够保证运行循环持续运行
    [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
    [runLoop run];

         // 线程结束之前,不会执行至此
         NSLog(@"%@", [NSThread currentThread]);
      }
    
  • 维护线程的生命周期,让线程不自动退出,isFinished
      为  Yes时退出

  • 在一定时间内监听某种事件,或执行某种任务的线程


####提示:一般在开发中很少会主动创建 Runloop,而通常会把事件添加到 Runloop 中。

###参考文章
官方文档
深入理解 Runloop
Runloop 原理和核心机制