首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Java Script (TVML)调用带有完成处理程序的Swift函数

从Java Script (TVML)调用带有完成处理程序的Swift函数
EN

Stack Overflow用户
提问于 2017-07-21 18:13:54
回答 1查看 517关注 0票数 3

我正在开发tvOS应用程序(使用TVML),我正在尝试从JS调用一个带有完成处理程序的Swift函数。

在TVApplicationControllerDelegate中,我尝试使用如下代码:

let getVastData : @convention(block) (String,  @escaping (UInt32, [String], String) -> ()) -> Void = {
    (url : String, _ completion:@escaping (_ duration: UInt32, _ addLinks: [String], _ videoLink: String) -> ()) -> Void in
    VastManager.shared.startParsing(with: url, completion)
}

jsContext.setObject(unsafeBitCast(getVastData, to: AnyObject.self), forKeyedSubscript: "getVastData" as (NSCopying & NSObjectProtocol)!)

但是我得到了一个错误:"TypeError: getVastData不是一个函数。(在'getVastData‘中,'getVastData’是NSBlock的一个实例“

你知道我哪里错了吗?或者知道如何通过JS的完成处理程序来纠正调用Swift func的错误吗?

提前谢谢你,米洛斯

EN

回答 1

Stack Overflow用户

发布于 2018-10-08 04:02:53

首先,我们需要在jsContext中注册Swift方法。我们的Swift方法需要接受回调函数,在本例中是对一个JavaScipt值的引用,该值将在Swift中的操作完成后被调用。

let getVastData : @convention(block) (String, JSValue) -> Void = {
    (url : String, completion : JSValue) -> Void in
    VastManager.shared.startParsing(from: url, completion: completion)
}
jsContext.setObject(unsafeBitCast(getVastData, to: AnyObject.self), forKeyedSubscript: "getVastData" as (NSCopying & NSObjectProtocol))

因为我们希望异步调用它,所以需要存储该引用。我们将使用JSManagedValue来存储JSValue,以避免保留周期。JSManagedValue对象包装了一个JSValue对象,添加了“条件保留”行为来提供值的自动内存管理。在我们的操作完成后,我们可以使用参数回调JavaScript回调函数。简而言之,我们只是将JS值从我们的TVML JS传递给Swift,存储它并在以后调用它。

class VastManager: NSObject {

    var completion: JSManagedValue?
    var url: String?

    public func startParsing(from url: String, completion: JSValue) {
        self.completion = JSManagedValue(value: completion)
        self.url = url
    }
    ...

    func parserDidEndDocument(_ parser: XMLParser) {

        ...

        _ = self.completion?.value?.call(withArguments: [duration, ads, videoUrl])
    }
}

最后,我们可以从JavaScript调用Swift函数并传递回调函数。

getVastData(vastTag, function(duration, adLinks, videoLink) {
   ...
}
// or
function updatePlayer(duration, adLinks, videoLink) {
   ...
}
getVastData(vastTag, updatePlayer) {
   ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45235021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档