当前位置: 首页 > 知识库问答 >
问题:

反应本地和目标C代表

濮阳品
2023-03-14

我对用本机代码反应本机和桥接机制很不熟悉,尤其是当框架有委托时。假设我正在尝试桥接以下框架:

@protocol BRPtouchNetworkDelegate;

@class PLNetworkModule;

@interface BRPtouchNetworkManager : NSObject <NSNetServiceBrowserDelegate,NSNetServiceDelegate>


@property(retain, nonatomic) NSMutableArray* registeredPrinterNames;
@property(assign, nonatomic) BOOL isEnableIPv6Search;


- (int)startSearch: (int)searchTime;
- (NSArray*)getPrinterNetInfo;

- (BOOL)setPrinterNames:(NSArray*)strPrinterNames;
- (BOOL)setPrinterName:(NSString*)strPrinterName;

- (id)initWithPrinterNames:(NSArray*)strPrinterNames;
- (id)initWithPrinterName:(NSString*)strPrinterName;

@property (nonatomic, assign) id <BRPtouchNetworkDelegate> delegate;

@end

@protocol BRPtouchNetworkDelegate <NSObject>

-(void) didFinishSearch:(id)sender;

@end

以下是我实现的桥接模块:

RCTBRPtouchNetworkManager。h

#import <React/RCTBridgeModule.h>
#import <BRPtouchPrinterKit/BRPtouchPrinterKit.h>

@interface RCTBRPtouchNetworkManager : NSObject <RCTBridgeModule, BRPtouchNetworkDelegate>
@end

RCTBRPtouchNetworkManager。m

#import "RCTBRPtouchNetworkManager.h"
#import <BRPtouchPrinterKit/BRPtouchPrinterKit.h>
#import <React/RCTLog.h>

@implementation RCTBRPtouchNetworkManager {
  BRPtouchNetworkManager  *_networkManager;
}

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(addEvent:(NSString *)name location:(NSString *)location)
{
  RCTLogInfo(@"Pretending to create an event %@ at %@", name, location); //a dummy method to test the bridge
}

RCT_EXPORT_METHOD(startSearchWithTimeout:(int)time) {
  RCTLogInfo(@"Bridge started search with time %d", time);

  _networkManager = [[BRPtouchNetworkManager alloc] init];
  _networkManager.delegate = self; //I'm setting delegate here
  _networkManager.isEnableIPv6Search = NO;
  NSString *  path = [[NSBundle mainBundle] pathForResource:@"PrinterList" ofType:@"plist"];
  if( path )
  {
    NSDictionary *printerDict = [NSDictionary dictionaryWithContentsOfFile:path];
    NSArray *printerList = [[NSArray alloc] initWithArray:printerDict.allKeys];
    [_networkManager setPrinterNames:printerList];
  } else {
    RCTLogInfo(@"PrinterList path not found");
  }

  //  Start printer search
  [_networkManager startSearch: 5.0];

}

- (void)didFinishSearch:(id)sender {
  NSLog(@"didFinishedSearch"); //this delegate method is not called
}

@end

我可以很容易地调用虚拟方法,并在日志中查看结果。但是,从未调用委托方法didFinishSearch()。我从javascript中调用它,如下所示:

componentDidMount() {
    let networkManager = NativeModules.BRPtouchNetworkManager;
    networkManager.startSearchWithTimeout(5.0);
}

我有什么遗漏吗?我是否正确地实现了委托?这种功能是否可能(似乎不可能,因为委托方法被iOS社区使用了很长时间)。非常感谢您的帮助。

编辑

我发现在我的bridge manager文件中添加以下内容会导致该代表被解雇(多亏了这篇文章)

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

然而,即使这解决了问题,我还是想对这里发生的事情有一个更技术性的理解,因为我似乎不能完全理解它。谢谢你

共有1个答案

祁英哲
2023-03-14

我知道这不是对这篇文章的回答,而是为了让你对dispatch\u get\u main\u queue()有更多的技术理解;将委托方法响应放在主线程上。由于JS是单线程的,因此后台线程上的任何进程都不可见。

 类似资料:
  • 问题内容: 我正在读取一个JSON文件,其中包含某些人的名称和图像URI。在遍历结构时,我可以打印名称,但无法显示图像。我也看到了那个阵营不支持动态图像,所以我做了一个解决办法的建议在这里。 JSON格式 主要成分 问题答案: 根据您期望的图像数量,您可以尝试将文件放置在文件夹中,如下所示: 然后在您的中,如果您要剪裁 资产:/中的 部分字符串,则可以使用: 如果要处理大量图像,则文件将变得难以维

  • 你好,我是新的反应原生,我试图安装反应原生sqlite存储改变安装,我按照Android安装的所有指令:[https://www.npmjs.com/package/react-native-sqlite-storage][1] 我尝试使用命令:react native run android运行它,但每次我都会遇到错误: 失败:生成失败,出现异常。错误:无法确定任务“:app:mergeDebu

  • 问题内容: 我正在React Native中开发一个需要使用Web Map Services的移动应用程序。我尚未找到任何允许同时使用WMS并进行本机响应的库或框架。在React(Web)中,我找到了一个。我的问题是: 您是否知道是否存在允许我使用WMS和React Native的任何库或框架,或者是否有可能在React native中集成React(web)库? 谢谢! 问题答案: 我决定使用的

  • 我正在构建一个基本的应用程序,我想从Laravel Echo实时获取事件数据。我正在使用stack.io.一切正常工作与laravel redis和一切运行和工作没有问题。但是,我没有从反应本机获得事件的控制台日志,也没有警告或错误。这是我的密码 反应原生App.js Laravle根,laravel echo服务器。json: 新闻消息事件: .环境: 我正在使用laravel tinker简单

  • 图标 1. android 图标 drawable 96*96 drawable-ldpi 36*36 drawable-mdpi 48*48 drawable-hdpi 72*72 drawable-xhdpi 96*96 drawable-xxhdpi 144*144 2. ios icon-small 29*29 icon-small@2x 58*58 icon-40 40*40 icon-

  • 问题内容: 我正在使用本机android并遇到问题将应用程序部署在android设备上。当我跑步 react-native启动,它不会在端口8081上启动dev服务器 我尝试了以下几种方法: 1)https://facebook.github.io/react- native/docs/troubleshooting.html 2)尝试停止在端口号8081上运行的进程,但未成功 我的问题是我们可以