非同期に実行されるユーザーを登録したいと考えています。ただし、ユーザーが正常に作成されたときにのみプログラムを続行する必要があるため、呼び出し関数は同期して動作します。 現在の実装は次のようになります。同期呼び出し内での非同期タスクの実行
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)
}
})
}
}
とのViewControllerで次のようにサインアップが開始されます。createUser
が投げる機能ではありませんので、
do {
try signup.signUpUser()
} catch let error as CustomErrorCodes {
// Process error
}
しかし、これは動作しません。どうすればsignUpUser()
が新しいユーザーが正常に作成された場合にのみtrueを返すことができますか?
これは良い提案です。私はデリゲートを使うとき、それは魅力のように機能します!しかし、どのような状況では、クロージャを使用するほうが良いでしょう(例えばsignUpUserへの呼び出しで)。これはタスクを非同期にするためです。 – Taco
コールバック関数を渡す利点は、コールバック関数を事前に知っていない場合です。 – matt
それは理にかなっています! – Taco