Я работаю над проектом пакета в swift, который используется как плагин авторизации , а в проекте пакета я выполняю вызов API-запроса, используя URLSession.shared.dataTask
, и в ответном ответе я получаю, я пытаюсь обновить пользовательский интерфейс, и так как обновление пользовательского интерфейса должно выполняться с использованием основного потока, я использую DispatchQueue.main.async
, а код внутри DispatchQueue.main.async
никогда не выполняется! Это прекрасно работает в обычном приложении MacOS Cocoa, но проблема сохраняется с проектом Bundle для MacOS.
CODE:
class MainForm: NSWindowController{
public var bodyParams: [String: Any]?
override func windowDidLoad() {
super.windowDidLoad()
testfetch{ (Response) in
os_log("In completion handler response: %@", Response)
//code to update some UI follows
}
}
func testfetch(completion: @escaping (Response) -> ()){
os_log("Is this mainthread in testFetch %@", Thread.isMainThread ? "Yes" : "No")
os_log("Current thread testFetch %@", Thread.current)
let url = URL(string: "https://example.com")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
bodyParams = ["username": "******", "password": "*****"]
if let bodyParams = bodyParams {
guard let body = try? JSONSerialization.data(withJSONObject: bodyParams, options: []) else {
return
}
request.httpBody = body
let task = URLSession.shared.dataTask(with: request) {(data, response, error) in
guard let data = data else {
os_log("Data not recieved!!")
return
}
os_log("Is this mainthread in dataTask %@", Thread.isMainThread ? "Yes" : "No")
os_log("Current thread in dataTask %@", Thread.current)
os_log("Data recieved in testFetch: %@", String(data: data, encoding: .utf8)!)
do{
let receivedData = try JSONDecoder().decode(Response.self, from: data)
DispatchQueue.main.async{
os_log("Is this mainthread in main.async %@", Thread.isMainThread ? "Yes" : "No")
os_log("Current thread in main.async %@", Thread.current)
completion(receivedData)
}
}
catch let Err{
os_log("Error is: %@", Err as! String)
}
}
task.resume()
}
}
struct Response: Codable {
let name, age, status: String
}
}
Журналы:
Is this mainthread in testFetch? Yes
Current thread testFetch <NSThread: 0x7f9176001c30>{number = 1, name = main}
Is this mainthread in dataTask No
Current thread in dataTask <NSThread: 0x7f9173dc2080>{number = 4, name = (null)}
Data recieved in testFetch: {"name":"JohnDoe", "age": "**", "status": "single"}
Таким образом, журналы в DispatchQueue.main.async
и обработчике завершения никогда не печатаются. Я совсем новичок в программировании и быстром c. Любая помощь будет очень признательна!