如何使用Async/Awaitswift进行进度报告?
How to do progress reporting using Async/Await swift?
我有一个需要 2 个回调的函数。我想将其转换为 async/await。但是我怎么能在不断返回进度的同时等待呢?
我正在使用 https://github.com/yannickl/AwaitKit 来摆脱回调。
typealias GetResultCallBack = (String) -> Void
typealias ProgressCallBack = (Double) -> Void
func getFileFromS3(onComplete callBack: @escaping GetResultCallBack,
progress progressCallback: @escaping ProgressCallBack) {
}
我是这样使用的:
getFileFromS3() { [weak self] (result) in
guard let self = self else { return }
// Do something with result
} progress: { [weak self] (progress) in
guard let self = self else { return }
DispatchQueue.main.async { [weak self] in
guard let self = self else {return}
// Update progress in UI
}
}
这是没有进度报告的转换后代码的样子:
func getFileFromS3() -> Promise<String> {
return async {
// return here
}
}
您可以使用与此类似的技术:
https://developer.apple.com/documentation/foundation/urlsession/3767352-data
从签名可以看出...
func data(for request: URLRequest,
delegate: URLSessionTaskDelegate? = nil) async throws
-> (Data, URLResponse)
...它是异步的,但它也需要一个委托对象:
https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate
如您所见,该委托接收任务进度的回调。您可以声明类似的东西,从而将该信息从委托传递给主要参与者和界面。
我有一个需要 2 个回调的函数。我想将其转换为 async/await。但是我怎么能在不断返回进度的同时等待呢? 我正在使用 https://github.com/yannickl/AwaitKit 来摆脱回调。
typealias GetResultCallBack = (String) -> Void
typealias ProgressCallBack = (Double) -> Void
func getFileFromS3(onComplete callBack: @escaping GetResultCallBack,
progress progressCallback: @escaping ProgressCallBack) {
}
我是这样使用的:
getFileFromS3() { [weak self] (result) in
guard let self = self else { return }
// Do something with result
} progress: { [weak self] (progress) in
guard let self = self else { return }
DispatchQueue.main.async { [weak self] in
guard let self = self else {return}
// Update progress in UI
}
}
这是没有进度报告的转换后代码的样子:
func getFileFromS3() -> Promise<String> {
return async {
// return here
}
}
您可以使用与此类似的技术:
https://developer.apple.com/documentation/foundation/urlsession/3767352-data
从签名可以看出...
func data(for request: URLRequest,
delegate: URLSessionTaskDelegate? = nil) async throws
-> (Data, URLResponse)
...它是异步的,但它也需要一个委托对象:
https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate
如您所见,该委托接收任务进度的回调。您可以声明类似的东西,从而将该信息从委托传递给主要参与者和界面。