Оценка javascript метод WKWebview дает проблему - PullRequest
0 голосов
/ 05 мая 2020

Я использую следующую функцию для оценки javascript, но запуск этого метода в основном потоке блокирует приложение. while l oop никогда не заканчивается. Есть ли другой способ сделать это или какое-либо исправление в этом методе?

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
        {
            __block NSString *resultString = nil;
            __block BOOL finished = NO;

            [self evaluateJavaScript:script completionHandler:^(id result, NSError *error) {
                if (error == nil) {
                    if (result != nil) {
                        resultString = [NSString stringWithFormat:@"%@", result];
                    }
                } else {
                    NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
                }
                finished = YES;
            }];

            while (!finished)
            {
                [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:NSDate .distantPast];
            }

            return resultString;
        }

1 Ответ

0 голосов
/ 07 мая 2020

Когда вы вызываете -[NSRunLoop runMode:beforeDate:], этот вызов блокируется, пока прогон l oop ожидает ввода.

Вам необходимо создать NSPort и добавить его в качестве источника ввода для NSRunL oop перед запуском. Внутри вашего обратного вызова асинхронной оценки JavaScript создайте NSPortMessage и затем отправьте его в NSPort. Это приведет к возврату вызова -[NSRunLoop runMode:beforeDate:], инициирующему завершенную проверку.

Однако, возможно, вы сможете сделать резервную копию и опубликовать, какую проблему вы пытаетесь решить? Желательно избегать подобного синхронного межпроцессного взаимодействия, чтобы основной поток вашего приложения оставался максимально свободным. Вероятно, поэтому WKWebView не предоставляет синхронный вариант оценки JavaScript.

...