RCBridge 初始化时声明了一个 CADisplayLink

_jsDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(_jsThreadUpdate:)];

_jsThreadUpdate 函数中,处理界面更新。这个 CADisplayLink 随后被加到 JS 线程对应的 RunLoop 中。

- (void)addToRunLoop:(NSRunLoop *)runLoop
{_runLoop = runLoop;[_jsDisplayLink addToRunLoop:runLoop forMode:NSRunLoopCommonModes];
}

RCTCxxBridge 声明了一个 thread

  _jsThread = [[NSThread alloc] initWithTarget:selfselector:@selector(runJSRunLoop)object:nil];_jsThread.name = RCTJSThreadName;_jsThread.qualityOfService = NSOperationQualityOfServiceUserInteractive;[_jsThread start];

并为这个 thread 声明了要给 RunLoop

// copy thread name to pthread name
pthread_setname_np([NSThread currentThread].name.UTF8String);// Set up a dummy runloop source to avoid spinning
CFRunLoopSourceContext noSpinCtx = {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
CFRunLoopSourceRef noSpinSource = CFRunLoopSourceCreate(NULL, 0, &noSpinCtx);
CFRunLoopAddSource(CFRunLoopGetCurrent(), noSpinSource, kCFRunLoopDefaultMode);
CFRelease(noSpinSource);RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"");// run the run loop
while (kCFRunLoopRunStopped != CFRunLoopRunInMode(kCFRunLoopDefaultMode, ((NSDate *)[NSDate distantFuture]).timeIntervalSinceReferenceDate, NO)) {RCTAssert(NO, @"not reached assertion"); // runloop spun. that's bad.
}

RunLoop 的调用方式之 performSelector

如下,原因是因为有如下调用:

  if ([NSThread currentThread] == _jsThread) {[self _tryAndHandleError:block];} else {[self performSelector:@selector(_tryAndHandleError:)onThread:_jsThreadwithObject:blockwaitUntilDone:NO];}

在 RunLoop 上执行一函数

  CFRunLoopPerformBlock(m_cfRunLoop, kCFRunLoopCommonModes, ^{ func(); });

Enqueues a block object on a given runloop to be executed as the runloop cycles in specified modes.

CADisplayLink 加到指定的 RunLoop 中,然后相应

_jsDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(_jsThreadUpdate:)];
[_jsDisplayLink addToRunLoop:runLoop forMode:NSRunLoopCommonModes];

转载于:https://www.cnblogs.com/huahuahu/p/RN-47-zhong-de-JS-xian-cheng-ji-RunLoop.html

RN 47 中的 JS 线程及 RunLoop相关推荐

  1. rn在java中什么意思_[React Native Android 安利系列]RN中使用js调用java代码

    欢迎大家收看react-native-android系列教程,跟着本系列教程学习,可以熟练掌握react-native-android的开发,你值得拥有: 书接上节,我们上节说道,如何控制原生andr ...

  2. 浅谈浏览器多进程与JS线程

    引言 一直对浏览器的进程.线程的运行一无所知,经过一次的刷刷刷相关的博客之后,对其有了初步的了解,是时候该总结一波了. 进程.线程之间的关系 一个进程有一个或多个线程,线程之间共同完成进程分配下来的任 ...

  3. 如何在java中调用js方法

    [java] view plain copy/* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager ...

  4. legend---十二、js中的js语句和函数和ready函数的关系是什么

    legend---十二.js中的js语句和函数和ready函数的关系是什么 一.总结 一句话总结: 函数和全局变量不必放到ready函数中 语句(调用函数和全局变量)的必须放到ready函数中 1.在 ...

  5. (转)Java中的守护线程

    Java的守护线程与非守护线程 守护线程与非守护线程 最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户线程和守护线程 所谓守护线程 ...

  6. 浅谈浏览器多进程与JS线程 1

    面试被问到了浏览器线程,没答出来,最终还是感谢拿到了offer 对于浏览器的知识还是知道的太少了,开始恶补TAT 文章目录 一.进程.线程之间的关系 二.浏览器内的进程 三.浏览器内核(渲染进程) 四 ...

  7. Node.js 线程你理解的可能是错的

    本文代码运行环境 系统:MacOS High Sierra Node.js:10.3.0 复制代码 Node.js是单线程的,那么Node.js启动后线程数是1? 答案:Node.js启动后线程数并不 ...

  8. Node.js 线程你理解的可能是错的 1

    本文代码运行环境系统:MacOS High SierraNode.js:10.3.0 Node.js是单线程的,那么Node.js启动后线程数是1? 答案:Node.js启动后线程数并不是1,以下面代 ...

  9. HTML中利用JS调用PHP (以登录为例)

    最近在做 Login 和 Register 的东西,因为需要用到 session 来存储用户的 id 和 用户名,所以需要调用 php 中的 session.由于不会 Ajax, 所以不得不用一些笨办 ...

最新文章

  1. 想知道数据表的用户或系统异动时间
  2. IntelliJ IDEA mac快捷键
  3. pythonrequests下载大文件_Python3 使用requests模块显示下载大文件显示进度
  4. 6 redhat 查看rtc时间_RTC 月度小报 9 月 | WebRTC M77、RTC大会即将开幕、实时码流加速...
  5. mysql Subqueries
  6. java binaryreader_Java字符流与字节流区别与用法分析
  7. centos7 服务器安装nginx,mysql,php
  8. js的隐含参数(arguments,callee,caller)使用方法
  9. spark 过滤log
  10. remoting 中事件找不到订阅者时引发异常的解决办法
  11. windows与linux线程,Linux和Windows两种风格的操作系统,创建线程的方式有何不同?...
  12. 北漂4年,我选择了回到家乡,我选择了父母在,不远行。
  13. 【微信小程序】---授权登陆---【巷子】
  14. tipask二次开发总结_tipask二次开发总结.docx
  15. 适合php编程的笔记本电脑,【求推荐】(女生用/编程) 的 笔记本(Thinkpad) - 笔记本电脑(Notebook)版 - 北大未名BBS...
  16. ARM平台处理器简介-ARMv7
  17. Eclipse安装InUbuntu18和简单使用
  18. 银行降转账额度 “余额宝”要当心了
  19. 项目打包打的是什么包_“微端打包+游戏平台”,H5游戏也可一键下载!
  20. 谷歌PR值停止更新的影响

热门文章

  1. 大学计算机系学生,大学计算机专业学生自我介绍
  2. python比较两张图片是否一样_opencv_判断两张图片是否相同
  3. 计算机知识小技巧,计算机知识---基本操作小技巧.pptx
  4. yili邮箱服务器配置,手把手教 个人SMTP服务器的配置 -电脑资料
  5. linux下kegg注释软件,KEGG功能注释工具 KofamKOALA 安装与使用
  6. 合工大850参考书_合肥工业大学计算机考研850上岸经验分享
  7. Python3最长连续递增序列问题
  8. 计算机组成原理唐朔飞课后答案第六章,计算机组成原理第六章部分课后题答案(唐朔飞版)...
  9. 计算机网络名词解释-csma cda,计算机专业对口升学模拟题1资料.doc
  10. import _ssl # if we can‘t import it, let the error propagate