Как вызвать обратный вызов после завершения делегата - PullRequest
0 голосов
/ 19 апреля 2019

Хорошо, ребята, вот моя дилемма.

Я работаю с Brother SDK, чтобы создать оболочку React Native для нашего мобильного приложения, и мы работаем над функцией автоматического обнаружения, которая была в SDK.

BRPTouchNetworkDelegate имеет только одну функцию для соответствия и выглядит так:

-(void)didFinishSearch:(id)sender

Наш заголовочный файл выглядит так:

@protocol BRWLANPrintOperationDelegate <NSObject>
- (void) showPrintResultForWLAN;
@end


@interface RNB2MatchRnPrinter : NSObject <RCTBridgeModule, BRPtouchNetworkDelegate>
{
    BRPtouchNetworkManager *networkManager;
    BRPtouchPrinter *ptp;
    BRPtouchPrintInfo *printerInfo;
    NSString *paperSize;
    NSString *filePath;
    NSString *ipAddress;
    NSString *printerModel;
    NSArray *allowedFileTypes;
    NSMutableArray *printerList;
    NSDictionary *printerDict;
    BOOL shouldAutocut;

}

@property NSArray *imagePathArray;
@property NSString *customPaperFilePath;
@property(nonatomic, assign) BOOL communicationResultForWLAN;
@property (nonatomic, weak)id<BRWLANPrintOperationDelegate> delegate;

Наша didFinishSearch функция выглядит следующим образом:

-(void)didFinishSearch:(id)sender
{
    NSLog(@"didFinishSearch");
    printerList = (NSMutableArray *)[networkManager getPrinterNetInfo];
    NSLog(@"_brotherDeviceList [%@]", (NSMutableArray *)[networkManager getPrinterNetInfo]);
    return;
}

, а наш метод React Native выглядит следующим образом:

RCT_EXPORT_METHOD(printerSearch:(RCTResponseSenderBlock)callback)
{
    [networkManager startSearch: 5];

    int64_t delayInSeconds = 10.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        RCTLogInfo(@"Dispatch has been called");
        NSMutableArray* connectedPrinters = (NSMutableArray*)[self->networkManager getPrinterNetInfo];
        for (BRPtouchDeviceInfo *printer in connectedPrinters) {
            self->printerDict = [[NSDictionary alloc] initWithObjectsAndKeys:
                                  printer.strModelName, @"modelName",
                                  printer.strIPAddress, @"ipAddress",
                                  printer.strMACAddress, @"macAddress", nil
                                  ];
            [self->printerList addObject:self->printerDict];

        }
        callback(@[[NSNull null], self->printerList]);
    });
}

Теперь, что происходит в потоке, мы иногдане получайте результат от Сетевого менеджера [networkManager getPrinterInfo], но мы получаем его в didFinishSearch.

И поскольку это сетевая операция, мы не знаем, сколько времени нам нужно для тайм-аута.

Идея состоит в том, чтобы получить данные printerList из didFinishSearch.

Есть ли способ сделать это и какой самый простой способ вернуть результат из didFinishSearchк методу React Native для обратного вызова?

Заранее спасибо.

...