Реагировать на представителей Native и Objective C - PullRequest
0 голосов
/ 02 июля 2018

Я новичок в том, чтобы реагировать на нативный и мостовой механизм с нативным кодом, особенно когда у фреймворка есть делегаты. Предположим, я пытаюсь соединить следующие рамки:

@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). Ваша помощь очень ценится.

EDIT

Я обнаружил, что добавление следующего к моему файлу менеджера мостов заставило делегата выстрелить (спасибо этому посту )

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

Однако, несмотря на то, что это решает проблему, я хотел бы получить более техническое понимание того, что здесь происходит, так как я не могу точно понять это. Спасибо

...