簡體   English   中英

Swift異步方法和返回/完成塊

[英]Swift async method and return / completion block

我正在嘗試在我的項目中創建一個使用一些輸入參數的異步方法。 如果參數正確,它將執行一些操作,然后調用完成塊。

但是,如果輸入參數不正確,則它將不會執行任何操作(因此,完成代碼塊將無法運行,因此我必須自己調用它)。

無論如何,我想知道最好的方法是什么...

我在想我可以讓該方法返回一個Status枚舉,該枚舉包含輸入的錯誤,然后還包含完成塊。

問題在於完成塊也可能有錯誤。 因此,也許應該是其他錯誤類型?

諸如此類...(以登錄為例)。

enum LoginRequestStatus {
    case missingEmail
    case missingPassword
    case requestingLogin
}

然后來自完成的錯誤可能是...

enum LoginError: Error {
    case noUserFound
    case invalidPassword
    case success
}

然后函數可能看起來像這樣...

func login(withEmail email: String, password: String, completion: (LoginError?) -> ()) -> LoginStatus {
    if email.isEmpty() {
        return LoginStatus.missingEmail
    }
    if password.isEmpty() {
        return LoginStatus.missingPassword
    }

    //make some async request here or something...

    //... if error...
    completion(LoginError.invalidPassword)

    return LoginStatus.requestingLogin
}

那有意義嗎? 那是Swifty嗎(我討厭這個詞,但刻畫了我的意思)? 我可以完全采用其他方法嗎?

謝謝

在我看來,可以使用throws來簡化與方法的交互。 我寫一個小例子。 通過這種實現,很容易不會因為exceptions而錯過錯誤。 如果請求成功,將顯示清晰的響應狀態。

引發錯誤:

enum LoginError: ErrorType {
    case missingEmail
    case missingPassword
}

回應狀態:

enum LoginRequestStatus {
    case noUserFound
    case invalidPassword
    case success
}

功能實現:

func login(withEmail email: String, password: String) throws -> LoginRequestStatus {

    guard email.characters.count > 0 else{
        throw LoginError.missingEmail
    }

    guard password.characters.count > 0 else{
        throw LoginError.missingPassword
    }

    // do some request

    return LoginRequestStatus.success
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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