return 当前 URL 具有完成处理程序的函数

Function that return current URL with completion Handler

我有一个 ShareExtension,我想在其中获得 current URL。这是我的功能:

var html: String?

    if let item = extensionContext?.inputItems.first as? NSExtensionItem,
        let itemProvider = item.attachments?.first,
        itemProvider.hasItemConformingToTypeIdentifier("public.url") {
        itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in
            if (url as? URL) != nil {
                html = (self.getHTMLfromURL(url: url as? URL))
            }

        }
    }

我的问题是我需要 html 但是当在那个函数之后使用 variablehtml 仍然是空的。我想我需要某种 completion handler 但我现在尝试了不同的东西,但无法正确...

这就是我的整个功能目前的样子(不工作,因为 html 变成空的 String

@objc func actionButtonTapped(){

    do {

        var html: String?

        if let item = extensionContext?.inputItems.first as? NSExtensionItem,
            let itemProvider = item.attachments?.first,
            itemProvider.hasItemConformingToTypeIdentifier("public.url") {
            itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in
                if (url as? URL) != nil {
                    html = (self.getHTMLfromURL(url: url as? URL))
                }

            }
        }


        let doc: Document = try SwiftSoup.parse(html ?? "")

        let priceClasses: Elements = try doc.select("[class~=(?i)price]")

        for priceClass: Element in priceClasses.array() {
            let priceText : String = try priceClass.text()
            print(try priceClass.className())
            print("pricetext: \(priceText)")
        }

        let srcs: Elements = try doc.select("img[src]")
        let srcsStringArray: [String?] = srcs.array().map { try? [=13=].attr("src").description }

        for imageName in srcsStringArray {
            print(imageName!)
        }

    } catch Exception.Error( _, let message) {
        print(message)
    } catch {
        print("error")
    }

}

目标 是有一个额外的 function 来获得 url(第一个代码示例)和我可以使用的完成处理程序创建的 html.

问题是我没有意识到我已经有了 completionHandlerloadItems。所以我现在所做的是将整个 do & catch 块放在另一个方法中,并在完成处理程序中调用它,如下所示:

@objc func actionButtonTapped(){

        var html: String?

        if let item = extensionContext?.inputItems.first as? NSExtensionItem,
            let itemProvider = item.attachments?.first,
            itemProvider.hasItemConformingToTypeIdentifier("public.url") {
            itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in
                if (url as? URL) != nil {
                    html = (self.getHTMLfromURL(url: url as? URL))
                    print("bruh")

                    self.doStuff(html: html)
                }
            }
        }
}

func doStuff(html: String?){
    do {
        let doc: Document = try SwiftSoup.parse(html ?? "")

        let priceClasses: Elements? = try doc.select("[class~=(?i)price]")

            for priceClass: Element in priceClasses!.array() {
            let priceText : String = try priceClass.text()
            print(try priceClass.className())
            print("pricetext: \(priceText)")
        }

        let srcs: Elements = try doc.select("img[src]")
        let srcsStringArray: [String?] = srcs.array().map { try? [=10=].attr("src").description }

        for imageName in srcsStringArray {
            print(imageName!)
        }

            } catch Exception.Error( _, let message) {
                print(message)
            } catch {
                print("error")

        }
}