gpt4 book ai didi

JavaScriptCore -- 将函数作为参数传递给 ObjC

转载 作者:行者123 更新时间:2023-11-29 12:49:24 25 4
gpt4 key购买 nike

我有一个使用 JavaScriptCore 的 UIWebView。我正在尝试从网页调用 ObjC 函数。但是,该函数需要异步调用,因此我传入了一个在调用异步 ObjC 函数时调用的回调函数。

我的理解是 JS 函数通过桥相当于 NSBlock。我目前的代码是:

context[@"currentUserLocation"] = ^( void(^callback)(NSString* str) )
{
NSLog(@"Starting Async Function");

//generic async function
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"delay complete");
callback( @"return value" );
});
};

我的做法有什么根本性的错误吗?从表面上看,ObjC 似乎不知道在什么上下文中运行回调函数。

最佳答案

我花了一点时间才掌握这个窍门。诀窍是不要将回调参数视为一个 block ,而是一个 JSValue,然后使用 JSValue API 调用它:

context[@"currentUserLocation"] = ^(JSValue *callback)
{
NSLog(@"Starting Async Function");

//generic async function
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"delay complete");
//Check we actually have a callback (isObject is the best we can do, there is no isFunction)
if ([callback isObject] != NO) {
//Use window.setTimeout to schedule the callback to be run
[context[@"setTimeout"] callWithArguments:@[callback, @0, @"return value"]];
}
});
};

将回调包装在 window.setTimeout() 调用中允许 JSVirtualMachine 处理调度和线程,我发现如果回调完成任何 UI 工作,直接调用回调通常会导致死锁。

关于JavaScriptCore -- 将函数作为参数传递给 ObjC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22790355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com