Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift异步方法和返回/完成块_Ios_Swift_Asynchronous - Fatal编程技术网

Ios Swift异步方法和返回/完成块

Ios Swift异步方法和返回/完成块,ios,swift,asynchronous,Ios,Swift,Asynchronous,我试图在我的项目中创建一个异步方法,该方法接受一些输入参数。如果参数正确,它将执行一些操作,然后调用完成块 然而,如果输入参数不正确,那么它就不会做这些事情(因此完成块不会运行,我不得不自己调用它) 不管怎样,我想知道最好的方法是什么 我想我可以让方法返回一个包含输入错误的状态枚举,然后还有完成块 问题是,也可能是来自完成块的错误。那么这可能是另一种错误类型 像这样的。。。(以登录为例) 那么完成时的错误可能是 enum LoginError: Error { case noUserFo

我试图在我的项目中创建一个异步方法,该方法接受一些输入参数。如果参数正确,它将执行一些操作,然后调用完成块

然而,如果输入参数不正确,那么它就不会做这些事情(因此完成块不会运行,我不得不自己调用它)

不管怎样,我想知道最好的方法是什么

我想我可以让方法返回一个包含输入错误的
状态
枚举,然后还有完成块

问题是,也可能是来自完成块的错误。那么这可能是另一种错误类型

像这样的。。。(以登录为例)

那么完成时的错误可能是

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
}
这有意义吗?是不是很快(我讨厌这个词,但它表达了我的意思)?有没有其他的方法可以让我完全做到这一点


谢谢

在我看来,可以使用
抛出
来简化与方法的交互。我写了一个小例子。通过这种实现,很容易避免由于
异常而错过错误。清除响应状态将显示请求是否成功

抛出错误:

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
}

我想如果我没有弄错你的问题,有两种类型的错误需要处理。您可以通过在完成块中设置另一个变量(比如int类型)来管理它,而不使用返回类型。例如,如果错误为“LoginRequestStatus”,则输入pass 100,对于另一个pass 101。然后在completion方法中检查int值是否为100,然后它是“LoginRequestStatus”类型,或者是其他类型。并据此进行管理。这有意义吗?您的方法也没有错,使用
抛出也没有错,每种方法也可以使用fine,Alamofire使用完成块和其他一些使用抛出来处理错误,此外,
返回LoginStatus
在这里似乎并不真正需要,因为它总是返回
LoginStatus.requestingLogin
,打电话有什么意义?谢谢。我将结合投掷错误和完成块。
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
}