Objective c 对本地和目标C学员作出反应

Objective c 对本地和目标C学员作出反应,objective-c,react-native,delegates,Objective C,React Native,Delegates,我对本地代码和桥接机制的反应非常陌生,尤其是当框架有委托时。假设我正在尝试连接以下框架: @protocol BRPtouchNetworkDelegate; @class PLNetworkModule; @interface BRPtouchNetworkManager : NSObject <NSNetServiceBrowserDelegate,NSNetServiceDelegate> @property(retain, nonatomic) NSMutableAr

我对本地代码和桥接机制的反应非常陌生,尤其是当框架有委托时。假设我正在尝试连接以下框架:

@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
我有什么东西不见了吗?我是否正确地实现了委托?这种功能可能吗(因为iOS社区很长一段时间以来都在使用委托方法,所以似乎不可能)。非常感谢你的帮助

编辑

我发现在我的bridge manager文件中添加以下内容会导致该代理被解雇(感谢)


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

我知道这不是对这篇文章的回答,而是对你要求的更技术性的理解的一点——dispatch_get_main_queue();将委托方法响应放在主线程上。因为JS是单线程的,所以后台线程上的任何进程对它都不可见。

Wow。这实际上是有道理的。如果您可以确认在使用react native bridges时,发生在后台线程上的委托需要被分派到主线程,我可以接受这个答案。因此,委托方法在调用它们的线程上运行。如果上面的代码片段有效,可以安全地假设它将位于后台线程上。这篇文章有更多的细节:因此我没有关于React Native的权威证据,除了我使用了不同的第三方SDK,代码片段还修复了委托方法并允许我获取事件。考虑到我在这件事上找到的信息和我自己的经验,我认为这是一个合理的推论!希望这足以让你接受我的回答哈哈!主席先生,这是一个很好的答覆
#import <React/RCTBridgeModule.h>
#import <BRPtouchPrinterKit/BRPtouchPrinterKit.h>

@interface RCTBRPtouchNetworkManager : NSObject <RCTBridgeModule, BRPtouchNetworkDelegate>
@end
#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
componentDidMount() {
    let networkManager = NativeModules.BRPtouchNetworkManager;
    networkManager.startSearchWithTimeout(5.0);
}
- (dispatch_queue_t)methodQueue
{
    return dispatch_get_main_queue();
}