【发布时间】:2018-08-28 04:17:15
【问题描述】:
我正在尝试创建一个在线移动应用程序,但找不到处理具有多个异步调用的函数的最佳方法。假设我有一个函数,例如以某种方式更新用户,但在单个函数调用中涉及多个异步调用。比如:
// Function caller
update(myUser) { (updatedUser, error) in
if let error = error {
// Present some error UI to the user
}
if let updatedUser = updatedUser {
// Do something with the user
}
}
// Function implementation
public func updateUser(user: User, completion: @escaping (User?, Error?) -> () {
// asynchronous call A
updateUserTable(user: User) { error in
if let error = error {
completion(nil, error)
} else {
// create some new user object
completion(user, nil)
}
}
// asynchronous call B
uploadMediaForUser(user: User) { error in
if let error = error {
completion(nil, error)
}
}
// asynchronous call C
removeOldReferenceForUser(user: User) { error in
if let error = error {
completion(nil, error)
}
}
// Possibly any additional amount of asynchronous calls...
}
在这种情况下,一个函数调用(如更新用户)涉及多个异步调用,这是全有还是全无的情况?例如,updateUserTable() 调用完成,但用户在 uploadMediaForUser() 运行时断开了互联网连接,这会引发错误。由于 updateUserTable() 完成得很好,我的函数调用者认为这个方法成功了,而实际上更新用户所涉及的所有事情都没有完成。现在我遇到了一个用户,该用户可能在我的数据库中存在不匹配的引用或错误信息,因为该用户的连接在通话过程中中断。
我该如何处理这种全有或全无的情况?如果每个异步调用都没有错误地完成,我知道更新用户是成功的。如果只有部分异步调用成功而一些失败,这很糟糕,我需要撤消成功的更改或再次尝试失败的方法。
在这种情况下我该怎么办?而且,我如何使用我的完成闭包来帮助识别所需的操作,具体取决于方法的成功或失败。他们都成功了吗?好,告诉用户。有的成功有的失败了吗?不好,还原更改或重试(我不知道)??
编辑:
仅仅用错误来调用我的完成似乎还不够。当然,用户看到某事失败了,但这无助于应用程序了解修复部分更改损坏所需的步骤。
【问题讨论】:
标签: swift asynchronous closures