簡體   English   中英

Swift 編寫一個帶有返回值的 async/await 方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM