我对用本机代码反应本机和桥接机制很不熟悉,尤其是当框架有委托时。假设我正在尝试桥接以下框架:
@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();
}
然而,即使这解决了问题,我还是想对这里发生的事情有一个更技术性的理解,因为我似乎不能完全理解它。谢谢你
我知道这不是对这篇文章的回答,而是为了让你对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上运行的进程,但未成功 我的问题是我们可以