首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >尝试从不同线程同步调用函数{promiseMethodWrapper}

尝试从不同线程同步调用函数{promiseMethodWrapper}
EN

Stack Overflow用户
提问于 2022-04-29 08:05:34
回答 1查看 686关注 0票数 5

这是我第一次尝试连接react本机和本地iOS应用程序。

在我的react本机iOS项目中,我创建了一个快速文件(它创建了一个桥接头),在这个快速文件中,我创建了一个示例方法来首先进行测试:

代码语言:javascript
运行
AI代码解释
复制
import Foundation

@objc(MyModule)
class MyModule: NSObject {

  @objc
  func testFunctionWithPromiseResolve(frame: Frame,
                                 resolver resolve: @escaping RCTPromiseResolveBlock,
                                 rejecter reject: @escaping RCTPromiseRejectBlock) {
    
    var resp = [String:Any]() //Init Dictionary
    
    resp.updateValue(frame, forKey: "frame");
    resolve(resp);
    
  }

  @objc
  static func requiresMainQueueSetup() -> Bool {
    return true
  }

}

在桥接头文件中,只有导入:

代码语言:javascript
运行
AI代码解释
复制
#import "React/RCTBridgeModule.h"
#import <VisionCamera/FrameProcessorPlugin.h>. //from react-native-vision-camera
#import <VisionCamera/Frame.h> //from react-native-vision-camera

然后我创建了一个名为MyModule.m的objective文件,并在其中添加了:

代码语言:javascript
运行
AI代码解释
复制
#import <Foundation/Foundation.h>
#import "React/RCTBridgeModule.h"

@interface
RCT_EXTERN_MODULE(MyModule, NSObject);
RCT_EXTERN_METHOD(testFunctionWithPromiseResolve:
                  (Frame *)frame
                  resolver:(RCTPromiseResolveBlock *)resolve
                  rejecter:(RCTPromiseRejectBlock *)reject);
                  
@end

然后,在react本机中,我有一个Home.js,在这里我将访问这个方法。

代码语言:javascript
运行
AI代码解释
复制
import React from 'react';
import { Text, StyleSheet, ScrollView, NativeModules } from 'react-native';
import { Camera, useCameraDevices, useFrameProcessor } from 'react-native-vision-camera';

import 'react-native-reanimated'

function Home(props) {

    const devices = useCameraDevices();
    const device = devices.back;

    const { MyModule } = NativeModules;

    const frameProcessor = useFrameProcessor((frame) => {

        'worklet';

        let res = MyModule.testFunctionWithPromiseResolve(frame);
        console.log(res);

        // .then((res) => {
        //     console.log(res);
        // }).catch((e) => {
        //     console.log(e);
        // })

    })

//... My other code is just UI-related in which I'm calling the frameProcessor in <Camera... using its prop frameProcessor={frameProcessor} as per react-native-vision-camera documentation.

根据我的理解,我们使用thencatch来处理一个承诺,因为我认为这就是我们从RCTPromiseResolveBlock得到的东西,但这不起作用,所以我只是尝试了console.log(res);,然后它打印了undefined

我得到的错误是:

代码语言:javascript
运行
AI代码解释
复制
Tried to synchronously call function {promiseMethodWrapper} from a different thread.

Possible solutions are:
a) If you want to synchronously execute this method, mark it as a Worklet
b) If you want to execute this method on the JS thread, wrap it using runOnJS

reanimated::REAIOSErrorHandler::raiseSpec()
    REAIOSErrorHandler.mm:18
reanimated::ErrorHandler::raise()::'lambda'()::operator()()
decltype(static_cast<reanimated::ErrorHandler::raise()::'lambda'()&>(fp)()) std::__1::__invoke<reanimated::ErrorHandler::raise()::'lambda'()&>(reanimated::ErrorHandler::raise()::'lambda'()&)
void std::__1::__invoke_void_return_wrapper<void, true>::__call<reanimated::ErrorHandler::raise()::'lambda'()&>(reanimated::ErrorHandler::raise()::'lambda'()&)
std::__1::__function::__alloc_func<reanimated::ErrorHandler::raise()::'lambda'(), std::__1::allocator<reanimated::ErrorHandler::raise()::'lambda'()>, void ()>::operator()()
std::__1::__function::__func<reanimated::ErrorHandler::raise()::'lambda'(), std::__1::allocator<reanimated::ErrorHandler::raise()::'lambda'()>, void ()>::operator()()
std::__1::__function::__value_func<void ()>::operator()() const
std::__1::function<void ()>::operator()() const
invocation function for block in vision::VisionCameraScheduler::scheduleOnUI(std::__1::function<void ()>)
F14F0161-E0DE-3D9C-851E-AD12F95A3073
F14F0161-E0DE-3D9C-851E-AD12F95A3073
F14F0161-E0DE-3D9C-851E-AD12F95A3073
F14F0161-E0DE-3D9C-851E-AD12F95A3073
F14F0161-E0DE-3D9C-851E-AD12F95A3073
_pthread_wqthread
start_wqthread

我已经在worklet中定义了useFrameProcessor

更新:

我更新了obj-c方法如下:

代码语言:javascript
运行
AI代码解释
复制
@objc(testFunctionWithPromiseResolve:resolver:rejecter:)
  func testFunctionWithPromiseResolve(_ frame: Frame,
                                 resolver resolve: @escaping RCTPromiseResolveBlock,
                                 rejecter reject: @escaping RCTPromiseRejectBlock) {...

在JS中我做到了:

代码语言:javascript
运行
AI代码解释
复制
let module = NativeModules.MyModule;

const frameProcessor = useFrameProcessor((frame) => {

        'worklet';
        //let module = NativeModules.MyModule; //didnt work either
        console.log(module.testFunctionWithPromiseResolve(frame));

    })

但我也有同样的错误:

EN

回答 1

Stack Overflow用户

发布于 2022-05-22 00:56:44

幸运的是我发现了这个问题。

  1. 自定义Frame Processor Plugins需要根据文档完成,文档地址是创建帧处理器插件,您需要使用VISION_EXPORT_FRAME_PROCESSOR导出定义插件的本地自定义代码,而使用RCT_EXTERN_MODULERCT_EXTERN_METHOD将失败。
  2. 您需要在js端导出自定义插件方法,文档地址是向JS公开您的帧处理器插件,如下所示:
代码语言:javascript
运行
AI代码解释
复制
import type { Frame } from 'react-native-vision-camera'

/**
 * Scans QR codes.
 */
export function scanQRCodes(frame: Frame): string[] {
  'worklet'
  return __scanQRCodes(frame)
}

但现在,这将是__scanQRCodes

代码语言:javascript
运行
AI代码解释
复制
module.exports = {
  plugins: [
    [
      'react-native-reanimated/plugin',
      {
        globals: ['__scanQRCodes'],
      },
    ],

要使babel.config.js文件生效,您必须重新启动metro-bundler。

他说:你必须重新开始项目才能生效。

我的代码如下:

我定制了一个名为MyModuleFrameProcessPlugin.m的Ojective-C MyModuleFrameProcessPlugin.m,代码实现如下:

代码语言:javascript
运行
AI代码解释
复制
#import <VisionCamera/FrameProcessorPlugin.h>
#import <VisionCamera/Frame.h>

@interface MyModuleFrameProcessPlugin : NSObject
@end

@implementation MyModuleFrameProcessPlugin

static inline id myCustomPlugin(Frame* frame, NSArray* arguments) {
  CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(frame.buffer);
  NSLog(@"myCustomPlugin: %zu x %zu Image. Logging %lu parameters:", CVPixelBufferGetWidth(imageBuffer), CVPixelBufferGetHeight(imageBuffer), (unsigned long)arguments.count);
  
  for (id param in arguments) {
    NSLog(@"myCustomPlugin:   -> %@ (%@)", param == nil ? @"(nil)" : [param description], NSStringFromClass([param classForCoder]));
  }
  
  return @{
    @"myCustomPlugin_str": @"Test",
    @"myCustomPlugin_bool": @true,
    @"myCustomPlugin_double": @5.3,
    @"myCustomPlugin_array": @[
      @"Hello",
      @true,
      @17.38
    ]
  };
}
VISION_EXPORT_FRAME_PROCESSOR(myCustomPlugin)
@end

创建一个名为ExamplePlugin.ts的新js插件,代码如下:

代码语言:javascript
运行
AI代码解释
复制
/* global __myCustomPlugin */
import type { Frame } from 'react-native-vision-camera';
declare let _WORKLET: true | undefined;
export function cusPlugin(frame: Frame): string[] {
  'worklet';
  if (!_WORKLET) throw new Error('my_custom_plugin must be called from a frame processor!');

  // @ts-expect-error because this function is dynamically injected by VisionCamera
  return __myCustomPlugin(frame, 'hello my_custom_plugin!', 'parameter2', true, 42, { test: 0, second: 'test' }, ['another test', 500]);
}

babel.config.js文件如下:

代码语言:javascript
运行
AI代码解释
复制
module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
  plugins: [
    [
      'react-native-reanimated/plugin',
      {
        globals: ['__myCustomPlugin']
      }
    ]
  ],
};

插件导入代码如下:

代码语言:javascript
运行
AI代码解释
复制
import {cusPlugin} from './ExamplePlugin';

调用代码如下:

代码语言:javascript
运行
AI代码解释
复制
  const frameProcessor = useFrameProcessor((frame) => {
    'worklet';
    const value = cusPlugin(frame);
    console.log(`Return Values: ${JSON.stringify(value)}`);
  }, []);
  //Use in Camera is  frameProcessor={frameProcessor}

我测试了我的代码,它是好的,我希望它能帮助你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72060767

复制
相关文章
【WebService】——SOAP、WSDL和UDDI[通俗易懂]
WebService的三要素:SOAP、WSDL和UDDI。soap用来描述传递信息的格式,wsdl描述如何访问具体的接口,uddi管理、分发查询WebService。
全栈程序员站长
2022/09/15
4K0
【WebService】——SOAP、WSDL和UDDI[通俗易懂]
内网渗透测试:活动目录 Active Directory 的查询
在上一节中,我们介绍了活动目录 Active Directory 的一些基本概念,活动目录中存储了域内的大部分信息,域内的每一台域控都有一份完整的本域的 Active Directory,我们可以通过连接域控的指定端口(636端口是LDAPS)来进行访问、查询与修改。
FB客服
2021/09/16
2.5K0
Kotlin IO 实例介绍,文件拷贝和目录查询
在前面介绍了IO的基本信息以及相关的函数:Kotlin I/O 的基本介绍 (zinyan.com)。而本篇将会基于上篇的介绍结合使用场景,介绍如何进行文件的复制拷贝等操作。
zinyan.com
2023/07/14
8390
Kotlin IO 实例介绍,文件拷贝和目录查询
开发人员为何需要企业服务总线?
引言 重要的应用程序很少是单独存在的;如果不能与其他的应用程序一起使用,应用程序将难以发挥很大的作用。面向服务的体系结构往往将应用程序集成在一起,这样它们就可以协同工作并提高工作效率,每个应用程序都分成必须相互集成的各个部分。SOA 模型——服务使用者调用服务提供者——可能看起来相当简单,但是它提出了两个重要的问题: 使用者如何找到它需要调用的服务的提供者 使用者如何快速而可靠地调用服务,而网络实际上很慢且不可靠? 对于这两个问题,有一个相当简单的答案,即采用称为企业服务总线 (ESB) 的方法。ESB 处
逸鹏
2018/04/11
1.9K0
开发人员为何需要企业服务总线?
谈谈对Web Service的理解
WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用。
葆宁
2019/04/19
8330
谈谈对Web Service的理解
WebService是什么鬼?
一、什么是Web Service 1. 什么是Web Service呢?从表面上看,WebService就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你
程序源代码
2018/03/30
1.2K0
WebService是什么鬼?
02.WebService_使用三要素
02.WebService_使用三要素 一、Java中WebService规范 JAVA 中共有三种WebService 规范,分别是JAX-WS、JAX-RS、JAXM&SAAJ(废弃)。 1.JAX-WS规范 JAX-WS 的全称为Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(Java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代。从ja
Java帮帮
2018/03/15
1.7K0
02.WebService_使用三要素
WebService扩展
SOAP、WSDL、XML Schema 已经可以完成点到点的调用,但点到点的调用不能完全发挥面向服务的特点
hotarugali
2022/02/28
6700
WebService扩展
【Android 逆向】应用安装目录 ( Android 应用的默认安装目录 | 查找 Android 应用的安装目录 | 查询当前正在运行的应用包名 | 根据包名查询应用安装路径 )
应用安装在 Android 系统中后 , 普通应用 会安装到 /data/app/ 目录下 ;
韩曙亮
2023/03/29
6.7K0
【Android 逆向】应用安装目录 ( Android 应用的默认安装目录 | 查找 Android 应用的安装目录 | 查询当前正在运行的应用包名 | 根据包名查询应用安装路径 )
WebService使用介绍(一)
1.编写SEI(Service Endpoint Interface),SEI在webservice中称为portType,在java中称为接口。
HUC思梦
2020/09/03
1.2K0
WebService使用介绍(一)
Web Services---初级篇1
1前言 通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项功能。Web Services 脚本平台需支持 XML + HTTP。 2web services 简介 ---- Web Services 可使您的应用程序成为 Web 应用程序。 Web Services 通过 Web 进行发布、查找和使用。 Web Services 是应用程序组件 Web Services 使用开放协议进行通信 Web Services 是独立的(self-cont
码神联盟
2018/04/02
6730
EasyCVR对接华为IVS查询目录共享信息列表接口的使用
EasyCVR在不断开拓接入协议及平台,目前我们正在对华为IVS平台做对接测试。由于接口众多,后期我们会挑几个重要的接口跟大家介绍一下。本文介绍查询共享目录信息列表这个接口。
TSINGSEE青犀视频
2021/11/11
4560
【Linux 内核】Linux 内核源码目录说明 ② ( drivers 目录 | fs 目录 | include 目录 | init 目录 | ipc 目录 | kernel 目录 )
drivers 目录中存储了 驱动程序 相关代码 , 如 USB 总线驱动程序 , PCI 总线驱动程序 , 显卡驱动程序 , 网卡驱动程序 等 ;
韩曙亮
2023/03/30
12.7K0
【Linux 内核】Linux 内核源码目录说明 ② ( drivers 目录 | fs 目录 | include 目录 | init 目录 | ipc 目录 | kernel 目录 )
/目录 、/home目录 、~目录的区别
cd / : 从任何用户执行该命令都会进入同一个目录,即所有用户共享,其下文件如图
狼啸风云
2019/10/22
4.2K0
/目录 、/home目录 、~目录的区别
【Linux 内核】Linux 内核源码目录说明 ① ( arch 目录 | block 目录 | certs 目录 | crypto 目录 | Documentation 目录 )
在上一篇博客 【Linux 内核】Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 ) 中 , 使用了 Visual Studio Code 查看 Linux 内核源码 , 本篇博客开始分析 Linux 内核源码结构 ;
韩曙亮
2023/03/30
12.6K0
【Linux 内核】Linux 内核源码目录说明 ① ( arch 目录 | block 目录 | certs 目录 | crypto 目录 | Documentation 目录 )
详解接口测试(1)-常见的网络通信协议
在网上查询编程相关资料,我们或多或少听过API (Application Programming Interface,应用程序编程接口)这个词,简称接口
Bug挖掘机
2022/09/28
1.1K0
详解接口测试(1)-常见的网络通信协议
【Linux 内核】Linux 内核源码目录说明 ③ ( lib 目录 | LICENSES 目录 | mm 目录 | net 目录 | samples 目录 | scripts 目录 )
mm 目录中存储了 内存管理 ( Memory Management ) 相关代码 ;
韩曙亮
2023/03/30
10.1K0
【Linux 内核】Linux 内核源码目录说明 ③ ( lib 目录 | LICENSES 目录 | mm 目录 | net 目录 | samples 目录 | scripts 目录 )
【Linux 内核】Linux 内核源码目录说明 ④ ( security 目录 | sound 目录 | tools 目录 | usr 目录 | virt 目录 )
文章目录 一、security 目录 二、sound 目录 三、tools 目录 四、usr 目录 五、virt 目录 一、security 目录 ---- security 目录中存储了 Linux 内核 安全模型 相关代码 ; 二、sound 目录 ---- sound 目录中存储了 声卡驱动 相关代码 ; 三、tools 目录 ---- tools 目录中存储了 与 Linux 内核交互 相关代码 ; 四、usr 目录 ---- usr 目录中存储了 用户打包 和 内核压缩 相关代码 ;
韩曙亮
2023/03/30
11K0
【Linux 内核】Linux 内核源码目录说明 ④ ( security 目录 | sound 目录 | tools 目录 | usr 目录 | virt 目录 )
axis2开发webservice(1)
开发webservice之前要先看一眼什么是webservice,并且了解一下webservice的概念。 SOAP SOAP(Simple Object Access Protocol),关于SOAP教程:http://www.w3school.com.cn/soap/index.asp l  SOAP 指简易对象访问协议 l  SOAP 是一种通信协议 l  SOAP 用于应用程序之间的通信 l  SOAP 是一种用于发送消息的格式 l  SOAP 被设计用来通过因特网进行通信 l  SOAP 独
cloudskyme
2018/03/19
1.3K0
点击加载更多

相似问题

Web服务目录- UDDI?

23

UDDI查询的有效XML示例?

14

如何通过UDDI How服务查询WSO2 UDDI注册中心(治理注册中心)?

12

Microsoft UDDI错误

10

Web服务发现: UDDI是下一个UDDI吗?

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档