【发布时间】:2021-12-20 01:58:03
【问题描述】:
我有一个有这两种方法的类:
private func send(method: String, path: String, code: Array<Int>, headers: HTTPHeaders, completionHandler: @escaping (Int) -> Void) {
let url: String = "\(self.credentials.url)/\(path)"
AF.request(url, method: HTTPMethod(rawValue: method), headers: headers)
.authenticate(with: self.request_credentials)
.response { response in
let status_code: Int = response.response!.statusCode
completionHandler(status_code as Int)
}
}
和
func list_files(path: String) {
let headers: HTTPHeaders = [
"Depth": "1"
]
send(method: "PROPFIND", path: path, code: [207, 301], headers: headers) { status_code in
self.status_code = String(status_code)
}
}
因此这两个函数都使用完成处理程序,因为 Alamofire 在其发出 HTTP 请求的过程中使用它们。
我知道我必须以这种方式使用完成处理程序来处理这些异步数据。
我当前的问题是现在我必须在视图中显示这些数据(比如说self.status_code),但我不知道该怎么做。当我这样显示时:
struct ContentView: View {
var body: some View {
let auth = Authentication(username: "****",
domain: "****",
password: "****",
port: ****,
proto: "****",
path:"****")
let commands = Commands(credentials: auth.get_credentials())
let _ = commands.list_files(path: "/")
Text(commands.status_code)
.padding()
}
}
它将显示status_code的初始化值(即0),而不是list_files方法的更新值。我知道这是因为这些完成处理程序的异步行为,并且当我显示它时该值尚未更新。
但问题是:我怎样才能设法将这个更新后的值正确地显示给用户?
我可能在这里做错了很多事情,我不介意收到完全不同的解决方案,因为我愿意遵循最佳做法。
谢谢。
【问题讨论】:
-
在你的方法 list_files 中传递一个 completionHandler 并在 UI 中显示这个完成的值。
-
这也是我尝试过的,但在视图中处理完成处理函数似乎很困难(或不可能?),你有什么例子可以说明我如何实现这一点吗?不过我会进一步检查。谢谢。
-
'viewModel.isRefreshing {[weak self](loading) in if loading { self?.updateUI() } } '
标签: ios swift asynchronous alamofire completionhandler