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

推荐订阅源

WordPress大学
WordPress大学
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Hacker News: Ask HN
Hacker News: Ask HN
N
News and Events Feed by Topic
Forbes - Security
Forbes - Security
The Last Watchdog
The Last Watchdog
TaoSecurity Blog
TaoSecurity Blog
Schneier on Security
Schneier on Security
SecWiki News
SecWiki News
V
Vulnerabilities – Threatpost
Project Zero
Project Zero
O
OpenAI News
W
WeLiveSecurity
Security Archives - TechRepublic
Security Archives - TechRepublic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
H
Hacker News: Front Page
Cisco Talos Blog
Cisco Talos Blog
Spread Privacy
Spread Privacy
Help Net Security
Help Net Security
P
Privacy & Cybersecurity Law Blog
K
Kaspersky official blog
S
Security @ Cisco Blogs
Latest news
Latest news
AWS News Blog
AWS News Blog
U
Unit 42
Martin Fowler
Martin Fowler
阮一峰的网络日志
阮一峰的网络日志
S
Secure Thoughts
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Know Your Adversary
Know Your Adversary
Scott Helme
Scott Helme
博客园 - 司徒正美
B
Blog RSS Feed
C
Check Point Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
Docker
Google Online Security Blog
Google Online Security Blog
Jina AI
Jina AI
aimingoo的专栏
aimingoo的专栏
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Last Week in AI
Last Week in AI
月光博客
月光博客
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
SegmentFault 最新的问题
NISL@THU
NISL@THU
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
Attack and Defense Labs
Attack and Defense Labs
小众软件
小众软件

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 原理和核心机制