gpt4 book ai didi

嵌套完成处理程序中的 Swift JSValue callWithArguments() 导致 BAD_ACCESS

转载 作者:搜寻专家 更新时间:2023-11-01 05:38:53 25 4
gpt4 key购买 nike

我有一个简单的函数,它将完成处理程序作为 JSValue。它是一个 JSValue,因为我将此函数用作 JSExport 协议(protocol)的一部分。

此函数然后使用另一个完成处理程序调用另一个内部方法。当调用第二个处理程序时,我想在 JSValue 上调用 WithArguments。

当我从第二个完成处理程序外部调用 WithArguments 时,这一切都按预期工作,但是当从第二个处理程序调用时,我得到了 BAD_ACCESS。

func myFunction(completion: JSValue) {

// If I put completion.callWithAttributes([]) here, everything works fine.

self.mySecondFunction(completion: {(result: Dictionary<String, AnyObject>) -> Void in

// If I put completion.callWithAttributes([]) here, I get a BAD_ACCESS
})
}

非常感谢任何帮助。谢谢!

最佳答案

我强烈建议您执行以下操作

[self.callback.context[@"setTimeout"]  
callWithArguments:@[callback, @0, items]];

当您要向 JavaScriptCore 对应方发送响应时。这将防止 TVML UI MainThread 挂起。如您所见,这是对延迟为 0 的 setTimeout javascript 函数的调用,您的回调和项目作为参数,例如:

setTimeout(callback,0,items) 

我不确定您是如何创建警报的,这里是来自 Apple 的警报:

createAlert : function(title, description) {  
var alertString = `<?xml version="1.0" encoding="UTF-8" ?>
<document>
<alertTemplate>
<title>${title}</title>
<description>${description}</description>
<button class="btn_close">
<text>OK</text>
</button>
</alertTemplate>
</document>`
var parser = new DOMParser();
var alertDoc = parser.parseFromString(alertString, "application/xml");
return alertDoc
}

与警报和您在此处看到的行为没有直接关系,更多的是调用它的副作用

completion.callWithArguments([]) 

以意想不到的方式。最好将完成保存在某处,并在对象实例上获取对它的引用。然后,当长任务结束时,你调用它。此外,如果您正在执行一项长期任务,那么您可以像这样在 NSOperation 中移动所有内容:

/** JavaScriptCore Callback Operation */  
@interface JSCallbackOperation: NSOperation
@property(nonatomic, strong) JSValue*callback;
@property(nonatomic, strong) id items;
@end
@implementation JSCallbackOperation
- (id)initWithItems:(id)items callback:(JSValue*)callback {
if(self = [super init]) {
self.items=items;
self.callback=callback;
}
return self;
}
- (void)main {
@autoreleasepool {
if(self.callback) {
NSLog(@"Dispatching %@", self.callback);
[self.callback.context[@"setTimeout"]
callWithArguments:@[self.callback, @0, self.items]];
}
}
}

在这一点上,你定义了一个 helper,然后用参数调用回调:

#pragma mark - API Helper  
- (void)handleResponseWithItems:(id)items callback:(JSValue*)callback {

NSArray *active_and_pending_operations = operationQueue.operations;
NSInteger count_of_operations = operationQueue.operationCount;

NSLog(@"Running operations: %ld of %ld", active_and_pending_operations.count, count_of_operations);

JSCallbackOperation *op = [[JSCallbackOperation alloc] initWithItems:items callback:callback];
[op setQueuePriority:NSOperationQueuePriorityNormal];
[op setCompletionBlock:^{
NSLog(@"Operation completed.");
}];
[operationQueue addOperation:op];

}

关于嵌套完成处理程序中的 Swift JSValue callWithArguments() 导致 BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289318/

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