Я работаю с пакетом DSBridge для подключения мобильного приложения (в данном случае кода iOS) к коду javascript, содержащему основную логику моего приложения. Это включает в себя запуск JavaScript на невидимом WKWebView.
Мой код JavaScript должен вызывать метод в нативном приложении iOS, которое должно выполняться асинхронно (чтобы не блокировать пользовательский интерфейс), для этого я использую обратные вызовы в JavaScript и завершениеHandler в нативном.
Функция My Objective C гласит:
- (void)read:(NSDictionary *) args :(JSCallback) completionHandler{
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
NSLog(@"In Read");
while(self->connection != NULL) {
if([self->connection isMessageAvailable]) {
[self->connection messageRetrieved];
NSLog(@"Message Received in ViewController");
completionHandler([self->connection getMessage], YES);
}
}
});
}
Который вызывается из моего JavaScript здесь:
function read() {
data = "reading";
dsBridge.call("read", data, function (read_result) {
console.log("read_result = ", read_result)
return read_result;
});
}
Проблема заключается в JavaScript, мне нужна функция JavaScript 'read', чтобы вернуть значение "read_result", как только приложение Native вернет сообщение. Прямо сейчас мой код вызывает целевой объект C, который выполняется правильно и возвращает требуемое значение в функцию обратного вызова в JavaScript, но функция JavaScript «read» уже завершена без возвращаемого значения.
Есть ли способ для меня остановить JavaScript, пока обратный вызов не будет завершен?