[英]iOS swift how can I await an async task inside a function that needs a return value
[英]Swift write an async/await method with return value
我想編寫一個帶有返回值的 async-await 方法,但我的代碼不起作用。 我還嘗試了另一種方式,例如DispatchQueue.global
DispatchGroup()
等。
這是我的代碼:
func checkPassCode() -> Bool {
var result = false
let closure = { (_ flag:Bool) -> Void in
result = flag
}
if var pin = self.keychain.get("pin") {
let userPin = self.pin.joined(separator: "")
let encryptedData = NSData(base64Encoded: pin, options: [])
AsymmetricCryptoManager.sharedInstance.decryptMessageWithPrivateKey(encryptedData! as Data) { (success, result, error) -> Void in
if success {
pin = result!
print("userPin is: \(userPin)")
print("storePin is: \(pin)")
closure(userPin == pin)
} else {
print("Error decoding base64 string: \(String(describing: error))")
closure(false)
}
}
}
return result
}
謝謝,瓦迪安評論。 我使用了一個閉包作為該方法的輸入參數。
// MARK: - PassCode Methods
func checkPassCode(completionHandler:@escaping (_ flag:Bool) -> ()) {
let storePin = getStorePin()
let userPin = self.pin.joined(separator: "")
AsymmetricCryptoManager.sharedInstance.decryptMessageWithPrivateKey(storePin as Data) { (success, result, error) -> Void in
if success {
let pin = result!
print("userPin is: \(userPin)")
print("storePin is: \(pin)")
completionHandler(userPin == pin)
} else {
print("Error decoding base64 string: \(String(describing: error))")
completionHandler(false)
}
}
}
func getStorePin() -> NSData {
if let pin = self.keychain.get("pin") {
return NSData(base64Encoded: pin, options: []) ?? NSData()
}
return NSData()
}
然后調用這個方法:
checkPassCode { success in
if success {
print("sucess")
} else {
print("not sucess!")
}
}
您可以將此框架用於 Swift 協程 - https://github.com/belozierov/SwiftCoroutine
當您調用 await 它不會阻塞線程而只會掛起協程,因此您也可以在主線程中使用它。
func awaitCheckPassCode() throws -> Bool {
let storePin = getStorePin()
let userPin = self.pin.joined(separator: "")
let manager = AsymmetricCryptoManager.sharedInstance
let (success, result, _) = try Coroutine.await {
manager.decryptMessageWithPrivateKey(storePin as Data, completion: $0)
}
return success && userPin == result
}
然后在協程中調用這個方法:
DispatchQueue.main.startCoroutine {
let success = try awaitCheckPassCode()
if success {
print("sucess")
} else {
print("not sucess!")
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.