私はRESTEngine.sharedEngine.registerUser関数を使ってサーバーからデータを取得するために以下の関数を使用しています。 "userCreationCall"はAPI呼び出しを行い、戻ってくるJSONを解析し、ユーザーを作成してそのユーザーを完了ブロックに渡します。完成ブロック内から変数を返すときのトラブル:
"makeUser"は、ユーザーのオブジェクトを返す別の関数にその中のユーザーを渡して、その完了ブロックを処理します。この関数は、自分のアプリケーション内の他の場所で使用するユーザーオブジェクトを返します。テスト目的のため
func userCreationCall(first: String, last: String, email: String, completionHandler: (User?, ErrorType?) ->()) {
RESTEngine.sharedEngine.registerUser(email, firstName: first, lastName: last, age: 12, success: { response in
if let response = response, result = response["resource"], id = result[0]["_id"] {
let params: JSON =
["name": "\(first) \(last)",
"id": id as! String,
"email": email,
"rating": 0.0,
"nuMatches": 0,
"nuItemsSold": 0,
"nuItemsBought": 0]
let user = User(json: params)
completionHandler(user, nil)
}
}, failure: { error in
completionHandler(nil, error)
})
}
func makeUser(first: String, last: String, email: String) {
userCreationCall(first, last: last, email: email) { user, error in
guard error == nil else {
print("Error creating a user! : \(error)")
return
}
returnUser(user!)
}
}
func returnUser(user: User) -> User {
return user
}
I「がmakeUser」の終了ブロック内に渡されたユーザオブジェクト割り当てられる「TESTUSER」の意図、のviewDidLoadに次の呼び出しを行う:ただし
override func viewDidLoad() {
super.viewDidLoad()
let testUser = makeUser("John", last: "Doe", email: "[email protected]")
print("\(testUser)")
}
を、場合I testUserを印刷すると、それはまだ空白になります(つまり、 "makeUser"の補完ブロック内でユーザーオブジェクトが割り当てられることはありません)。私のロジック/実装がどこに間違っているのか誰かが手掛かりを持っていますか?前もって感謝します!
を必要とされていませんあなたが望む出力を返すのではなく、 – iphonic
あなたは[その他の回答](http://stackoverflow.com/a/37887015/1271826)から 'makeUser'を受け取りましたが、非同期メソッドから値を返すことはできないという基本的な点を理解していないようです(そして 'getUser'は非同期メソッドになりました)。非同期メソッドを呼び出すときは、結果を返そうとせず、常に完了ハンドラパターンなどの非同期プログラミングパターンに従います。 – Rob
あなたは "makeUser"の完了ブロック内にユーザーオブジェクトが割り当てられることはありません。いいえ、値を取得しますが、後で 'viewDidLoad'が既に完了した後です。 'viewDidLoad'ではなく、補完ブロックの中でのみ値を使うことができます。 – Rob