>source

특히 프레임 워크가 대리인이있는 경우 특히 원시 code로 원시 code와 함께 브리징 메커니즘을 반응시키는 것이 매우 좋습니다. 내가 다음 프레임 워크를 다리려고한다고 가정합니다.

@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

다음은 내가 구현 한 브리지 모듈입니다.

rctbriptouchnetworkmanager.h.

#import <React/RCTBridgeModule.h>#import <BRPtouchPrinterKit/BRPtouchPrinterKit.h>@interface RCTBRPtouchNetworkManager : NSObject <RCTBridgeModule, BRPtouchNetworkDelegate>@end

rctbrouchnetworkmanager.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

나는 더미 방법을 쉽게 호출하고 로그의 결과를 볼 수 있습니다. 그러나 Delegate 메서드 didfinishSearch ()는 결코 호출되지 않습니다. 다음과 같이 JavaScript에서 이것을 호출합니다.

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

나는 누락 된 것이 있습니까? 위임자를 제대로 구현하고 있습니까? 이런 종류의 기능이 가능하며 (위임 방법이 iOS 커뮤니티가 오랫동안 사용한 것으로 보이지 않을 수 없습니다). 당신의 도움이 많이 감사합니다.

편집

내 브리지 관리자 파일에 다음을 추가하는 것이 델리게이트를 화재로 만들었습니다 (감사)

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

그러나, 이것은 문제를 해결하더라도, 나는 그것을 정확하게 파악하는 것처럼 보일 수없는 것처럼 보일 수 없기 때문에 여기에가는 일에 대한 기술적 인 이해를 원합니다. 감사합니다

  • 이전 arrays : 모든 프로세스에 의해 모든 프로세스에 의해 확산 된 배열의 다른 부분을 C에서 MPI가있는 단일 마지막 어레이로 두는 더 좋은 방법
  • 다음 c++ : openmp 큰 메모리 배열