Как создать метод 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)
}
Любая помощь будет оценена по достоинству!