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
}