Невозможно вызвать собственный модуль ios из собственного проекта React - PullRequest
0 голосов
/ 06 июля 2018

Привет, друзья! Я хочу, чтобы мой плагин реагировал на родной, и я хочу вызвать функцию собственного модуля ios из моего реактивного js-файла, поэтому ниже приведен мой код

код библиотеки ios, как показано ниже

@implementation RNMyLib

- (dispatch_queue_t)methodQueue{
   return dispatch_get_main_queue();
 }
RCT_EXPORT_MODULE()


 RCT_EXPORT_METHOD(findEvents:(RCTResponseSenderBlock)callback)
 {
    NSString * strName = @"findEvents";

   callback(strName);
}

Код файла JS, как показано ниже

 import { NativeModules } from 'react-native';

 var MyLibManager = NativeModules.RNMyLib;

 MyLibManager.findEvents((strName) => {
    console.log("GET FUN CODE >>>>> "+ strName);
 });

Я хочу просто вызвать простую функцию из моего js-файла в классе собственной библиотеки ios, но когда я запускаю код выше, я получаю сообщение об ошибке типа TypeError: undefined не является объектом (вычисление 'MyLibManager.findEvents')

Есть идеи, как мне это решить? все ваши предложения применимы

1 Ответ

0 голосов
/ 06 июля 2018

Так что в вашем нативном коде вам действительно нужно передать NSArray обратно callback. Вроде как.

RCT_EXPORT_METHOD(findEvents:(RCTResponseSenderBlock)callback)
{
  NSArray *events = ...
  callback(@[[NSNull null], events]);
}

Первый элемент в NSArray - это ваш шанс передать ошибку. В вашем случае это всегда разрешается, поэтому просто оставьте его [NSNull null]. Вторым аргументом вместо events в этом примере будет ваш strName.

Со стороны JS обратный вызов фактически является традиционным обратным вызовом node, который принимает ошибку в качестве первого аргумента, а фактический элемент разрешается во втором аргументе. Так что вместо

MyLibManager.findEvents((_, strName) => {
    console.log("GET FUN CODE >>>>> "+ strName);
})

Если вам больше нравится шаблон обещания, вы можете использовать следующее:

RCT_REMAP_METHOD(findEvents,
                 findEventsWithResolver:(RCTPromiseResolveBlock)resolve
                 _:(RCTPromiseRejectBlock)reject) // I like to leave this as _ if it never fails
{
  NSString *strName = @"findEvents";
  resolve(strName);
}

А из JS.

const strName = await MyLibManager.findEvents;
...