返回当前URL的函数和完成处理程序

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

我有一个 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 但当使用 variable 紧接着 html 仍然是空的。我想我需要某种 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? $0.attr("src").description }

        for imageName in srcsStringArray {
            print(imageName!)
        }

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

}

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

ios swift completionhandler share-extension
1个回答
1
投票

问题是,我没有意识到我已经有了一个叫做? 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? $0.attr("src").description }

        for imageName in srcsStringArray {
            print(imageName!)
        }

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

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