评估WKWebview的JavaScript方法给出的问题。

问题描述 投票:0回答:1

我使用下面的函数来评估javascript,但是在主线程上运行这个方法会阻塞应用程序。这个 while 循环永远不会结束。有没有其他方法可以做到这一点,或者修复这个方法?

- (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;
        }
ios objective-c wkwebview
1个回答
0
投票

当你调用 -[NSRunLoop runMode:beforeDate:],该调用将在运行循环等待输入时阻塞。

你需要创建一个NSPort,并在运行NSRunLoop之前将其添加为输入源。在异步evaluateJavaScript回调中,创建一个NSPortMessage,然后将其发送到NSPort。这将导致 -[NSRunLoop runMode:beforeDate:] 调用返回,触发你的完成检查。

不过,也许你可以回贴一下你要解决的问题是什么?最好避免这样的同步进程间通信,以保持你的应用程序的主线程尽可能的空闲。这很可能是WKWebView没有公开evaluateJavaScript的同步变体的原因。

© www.soinside.com 2019 - 2024. All rights reserved.