Функция, которая возвращает текущий URL с обработчиком завершения - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть 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")
    }

}

Цель 1018 * состоит в том, чтобы иметь дополнительный function для получения url (1-й пример кода) с обработчиком завершения, в котором я может работать с созданным html.

1 Ответ

1 голос
/ 27 апреля 2020

проблема была в том, что я не осознавал, что у меня уже есть completionHandler с loadItems. Итак, теперь я поместил весь блок 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")

        }
}
...