我想註冊一個執行異步的用戶。但是,調用函數的行爲是同步的,因爲程序只應在用戶成功創建時纔會繼續。 當前的實現是:在同步調用中執行異步任務
class SignUp: NSObject {
// ...
func signUpUser() throws -> Bool {
guard hasEmptyFields() else {
throw CustomErrorCodes.EmptyField
}
guard isValidEmail() else {
throw CustomErrorCodes.InvalidEmail
}
createUser({ (result) in
guard result else {
throw CustomErrorCodes.UserNameTaken
}
return true // Error: cannot throw....
})
}
func createUser(succeeded: (result: Bool) ->()) -> Void {
let newUser = User()
newUser.username = username!
newUser.password = password!
// User is created asynchronously
createUserInBackground(newUser, onCompletion: {(succeed, error) -> Void in
if (error != nil) {
// Show error alert
} else {
succeeded(result: succeed)
}
})
}
}
,並在視圖控制器的註冊啓動如下:
do {
try signup.signUpUser()
} catch let error as CustomErrorCodes {
// Process error
}
然而,這不起作用,因爲createUser
不是投擲功能。我如何才能確保signUpUser()
只有在成功創建新用戶時纔會返回true?
這是一個很好的建議。當我使用委託時,它就像一個魅力!然而,在什麼情況下使用閉包(比如對signUpUser的調用)會更好,因爲這也會使任務異步? – Taco
傳遞迴調函數的好處是當你事先不知道什麼函數回調時! – matt
這很有道理! – Taco