RN 47 中的 JS 线程及 RunLoop

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java nginx https_docker nginx 配置ssl,实现https

docker nginx 配置ssl,实现https2019-09-05 16:06:35.0nginx配置https总览在nginx配置ssl实现https,简单来说分为三个步骤:1 上传ssl证书等文件将 1_www.domain.com_bundle.crt 和 2_www.domain.com.key 上传到nginx配置文件的目录旁边。这两…

Java EE 8 MVC:使用表单参数

在前两篇文章中,我们了解了如何在即将到来的Java EE MVC框架中使用查询和路径参数 。 这篇文章重点介绍表单参数。 当您使用发布请求提交Web表单时,表单值将作为请求正文的一部分发送。 媒体类型(或内容类型)定义了用于在请求正文…

Elasticsearch索引自动删除

简介 脚本分2部分,1部分查找符合条件的索引名,2脚本调用1脚本,进行删除操作 脚本 查找符合条件的,默认大于30天 # coding:utf-8__author__ Jipu FANGfrom elasticsearch import Elasticsearch import re import time import dat…

JavaScript入门几个概念

JavaScript入门几个概念 刚刚入门JavaScript的时候,搞懂DOM、BOM以及它们的对象document和window很有必要。 DOM是为了操作文档出现的API,document是它的一个对象。BOM是为了操作浏览器出现的API,window是它的一个对象。DOM When a web page …

idea中使用osgi_OSGi环境中的Servlet基本身份验证

idea中使用osgi您首先需要获得对OSGI HTTP Service的引用。 您可以通过声明性服务来做到这一点。 这篇文章将集中在获得对HTTP服务的引用之后的步骤。 注意:此职位的完整课程位于此处 通过OSGI HTTP Service注册Servlet时,它为您提供了提供HTTPContext实…

java spring aop 注解包_Spring AOP 注解配置实例

Spring AOP注解例子一:导入相关jar包。首先导入Spring的相关包(这里就不多说了,我这里是3.2.4版本的)然后导入AOP注解的相关包(不是spring的包)aspectjrt-1.6.7.jar和aspectjweaver-1.6.8.jar和aopalliance.jar(注意这里最好是1.6.7以上的版本&#xff0…

email

163邮件发送 private void SendEmail(string content){SmtpClient mSmtpClient new SmtpClient();mSmtpClient.Host "smtp.163.com";mSmtpClient.Port 25;mSmtpClient.UseDefaultCredentials true;mSmtpClient.EnableSsl false;var mSenderUsername "abc&q…

java web 有哪些标签库_java web中jsp常用标签

在jsp页面开发过程中,经常需要使用JSTL(Java Server Pages Standard Tag Library)标签开开发页面,是看起来更加的规整舒服。JSTL主要提供了5大类标签库:1. 核心标签库: 为日常任务提供通用支持,如显示和设置变量,重复使用一组项目,测试条件以及其他操作(…

微服务有麻烦吗? Lagom在这里为您提供帮助。 尝试一下!

蛋糕支持。 我们很自豪地宣布,新的Apache许可的微服务框架Lagom可在GitHub上使用 ! 当其他框架专注于打包和实例启动时,Lagom重新定义了Java开发人员构建基于微服务的应用程序的方式。 服务是异步的。 服务内通信由您管理。 流是开箱即用的。…

vue element-ui IE9--11报 “无法获取未定义或null引用的属性‘toLowerCase’”

今天做zymh比赛的一个管理后台,用的技术是vueelement-uivue-routeraxios,其他浏览器运行的很好,但是在IE(从IE11到IE9,vue支持IE9以上)都报错 点进去就是定位到了markUp这个函数,经查询是elemen…

执行力

什么是执行力? 员工执行力就是员工能够按质按量、一丝不苟地做好上级交待的工作,衡量的基本标准是提供了上级(客户或公司)满意的结果。 那种不能创造价值,不能提供结果的,不是真正的执行力,只是…

接口中的默认方法和静态方法

在我们最初的Java 8支持公告中,我们特别提到了缺少流,但是完全错过了默认/静态本机接口不起作用的事实。 现在,由于有一个警惕的社区成员指出了这一问题,因此此问题已得到解决。 由于限制需要全新构建才能使它们正常工作&#xf…

海思芯片硬件java加速_海思芯片直播延迟测试结果(小于100毫秒)

背景最近接触了许多客户,许多是做安全方面产品的客户,有些还涉及到jun队后勤的等等,他们普遍对采集延迟,编码延迟,传输延迟等都有很大关注。例如有个客户是做反狙击探测的,那可是与生命相关的,容…

for 循环练习题

X3 * 6528 3X * 8256X为一个数字 填入一个数字 使等式成立 for (var x1;x<9&&x>0;x) { if ((x*103)*6528(3*10x)*8256) { break; } }document.write(x); 第二题&#xff1a;在页面上输出以下图形 * *** ***** ******* ********* 第一种&#xff1a; …

java jsp登录的验证码_Java Web实现登录验证码(Servlet+jsp)

1.生成验证码图片(Servlet)importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.util.Random;importjavax.imageio.ImageIO;importjavax.servlet.ServletException;importjavax.ser…

shrinkwrap_Java EE 6测试第二部分– Arquillian和ShrinkWrap简介

shrinkwrap在Java EE 6测试的第一部分中&#xff0c;我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API&#xff0c;以演示如何启动该容器&#xff0c;如何在项目类路径中查找bean以及运行非常简单的集成测试。 这篇文章重点介绍Arquillian和ShrinkWrap以及为什么它…

android UI

A015-布局之LinearLayout good 巫山老妖 Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载) Android&#xff1a;控件GridView的使用 Android:将View的内容映射成Bitmap转图片导出 android中恶心的getDrawingCache Android XML shape 标…

java中三个基本框架_对于Java基础者应该如何理解Java中的三大框架!

三大框架&#xff1a;StrutsHibernateSpringJava三大框架主要用来做WEN应用。Struts主要负责表示层的显示Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作)Hibernate主要是数据持久化到数据库再用jsp的servlet做网页开发的时候有个 web.xml的映射文件&#xff0c;里面…

关于JS中的 NEW 和VAR

很多人都觉得在javascript声明一个变量&#xff0c;加var和不加var没有什么区别&#xff0c;实际上是一个错误的观点&#xff0c;如果在函数外面&#xff0c;也就是说在window区域加不加var确实是一样&#xff0c;因为都会是全局变量的效果&#xff0c;而如果在函数内部&#x…

Apache Camel的性能调整思路

时不时地&#xff0c;我会以Camel速度较慢的说法来询问有关优化Camel应用程序的问题。 骆驼只是连接不同系统的粘合剂&#xff0c;路由引擎全都在内存中&#xff0c;并且不需要任何持久状态。 因此&#xff0c;在99&#xff05;的情况下&#xff0c;性能问题是由于其他系统的瓶…