Ios Swift编写一个带有返回值的异步/等待方法
我想编写一个带有返回值的异步等待方法,但我的代码不起作用。我还尝试了另一种方法,例如Ios Swift编写一个带有返回值的异步/等待方法,ios,swift,asynchronous,async-await,dispatch,Ios,Swift,Asynchronous,Async Await,Dispatch,我想编写一个带有返回值的异步等待方法,但我的代码不起作用。我还尝试了另一种方法,例如DispatchQueue.globalDispatchGroup()等等。 这是我的代码: func checkPassCode() -> Bool { var result = false let closure = { (_ flag:Bool) -> Void in result = flag } i
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协程- 当您调用wait时,它不会阻塞线程,而只是挂起协程,因此您也可以在主线程中使用它
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!")
}
}
真的,别这样。在异步任务完成后,将闭包传递给要调用的函数。@Paulw11是否有其他方法不传递闭包来解决问题?我还想简单地写一下。您没有确切地描述什么“不起作用”,但似乎您正在死锁主队列。采用异步任务是iOS开发的一个基本部分。在iOS中,闭包是非常简单和容易理解的programming@Paulw11Yeah,你说得对,我把主队锁死了。我认为如果传递一个闭包,那么我必须为每个方法调用声明一个闭包,对吗?@Paulw11I用闭包的定义更改了我的代码