Как создать метод Swift для использования AssessmentJavaScript с GCD

Как мне создать метод macOS, который принимает параметр URL-адреса и возвращает HTML с помощью evalJavaScript?

Я хочу очистить URL-адрес, использующий JavaScript, поэтому ни String(contentsOf: url), ни URLSession.shared.dataTask(with: url), похоже, не работают.

Приведенный ниже код работает, но он создает глобальный, а не возвращает String. Мне нужен код, который можно использовать в других подобных проектах.

Могу ли я использовать didSet{} или GCD DispatchGroup() и group.enter() и group.leave() для создания либо класса, либо расширения ViewController для создания простого метода, который возвращается только после загрузки страницы и выполнения JavaScript? Я предполагаю, что мне понадобится класс для перехвата вызовов WKNavigationDelegate.

Мне нужен метод macOS, а не метод iOS.

Вот мой рабочий код:

ViewController.swift

import Cocoa
import WebKit

class ViewController: NSViewController, WKNavigationDelegate {
var webView: WKWebView!
var  webString: String = "" {
    didSet {
        print("webString: \(webString.count) Bytes")
        print("\(webString)")
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.webView = WKWebView()
    webView.navigationDelegate = self

    let url = URL(string: "https://www.someWebsite.com")!
    let myRequest = URLRequest(url: url)
    webView.load(myRequest)
}

// WKNavigationDelegate methods
func webView(_ webView: WKWebView, didFinish: WKNavigation!) {
    print(#function)

    webView.evaluateJavaScript(
        "document.documentElement.outerHTML.toString()",
        completionHandler: { (html: Any?, error: Error?) in
            self.webString = html as! String
            print("In compHandler, HTML: \(self.webString.count) bytes\n")
    })
}

func webView(_ webView: WKWebView, didFail: WKNavigation!, withError: Error) {
    print(#function)
    print("ERROR: Error=\(withError)")
}

Мне нужно что-то похожее на этот код, который я использую для синхронной загрузки:

func downloadDataTask(url: String) -> String {
var returnStr = ""

guard let myURL = URL(string: url) else {
    showErrorAlert(
        title: "ERROR: Invalid URL",
        message: "Invalid URL in downloadDataTask()\n  URL:'\(url)'")
    return("Error: Invalid URL: '\(url)'")
}

let group = DispatchGroup()
group.enter()

let task = URLSession.shared.dataTask(with: myURL) { data, urlResponse, error in

    if let myData = data {
        let string = String(decoding: myData, as: UTF8.self)
        returnStr = string

        group.leave()
    } else {
        showErrorAlert(
            title: "ERROR: Unable to load HTML from URL",
            message: "Unable to load HTML in downloadDataTask()\n")
        group.leave()
    }
}
task.resume()

// wait for async completion handler task to complete
group.wait()

return(returnStr)
}

Любая помощь будет оценена по достоинству!

0 ответов

Другие вопросы по тегам