아래 함수를 사용하여 RESTEngine.sharedEngine.registerUser 함수를 통해 내 서버에서 데이터를 가져옵니다. "userCreationCall"은 API 호출을 수행하고 JSON을 파싱하고 JSON을 파싱하여 사용자를 만든 다음 해당 사용자를 완료 블록에 전달합니다.완료 블록 내에서 변수를 반환하는 데 문제가 발생했습니다.
"makeUser"는 사용자가 내 응용 프로그램의 다른 곳에서 사용할 사용자 개체를 반환하는 다른 함수에 그 안에 사용자를 전달하여 해당 완료 블록을 처리합니다. "TESTUSER"에 대한 의도 내가있는 viewDidLoad에서 다음 호출을 테스트 목적으로
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
}
는 "makeUser"의 완료 블록 내에서 전달 된 사용자 개체 할당 할 : 그러나
override func viewDidLoad() {
super.viewDidLoad()
let testUser = makeUser("John", last: "Doe", email: "[email protected]")
print("\(testUser)")
}
을 때 testUser를 출력해도 여전히 공백이 발생합니다 ("makeUser"의 완료 블록 내에서 사용자 객체가 할당되지 않음을 의미). 누구든지 내 논리/구현이 잘못 된 것에 대한 단서가 있습니까? 미리 감사드립니다!
무엇을 출력 대신 원하는 것을 출력하십시오. – iphonic
당신은 [그 다른 대답] (http://stackoverflow.com/a/37887015/1271826)에서'makeUser'를 가져 왔지만 근본적인 점을 이해하지 못했기 때문에 비동기 메서드에서 값을 반환 할 수는 없습니다 (그리고'getUser'는 이제 비동기 메소드입니다). 비동기 메서드를 호출 할 때는 결과를 반환하지 말고 항상 완료 핸들러 패턴과 같은 비동기 프로그래밍 패턴을 따르십시오. – Rob
"makeUser"의 완료 블록 내에서 사용자 개체가 할당되지 않습니다. 아니요, 값을 얻지 만, 나중에'viewDidLoad'가 이미 끝난 후에 말이에요. 'viewDidLoad'가 아니라 완료 블록에서만 값을 사용할 수 있습니다. – Rob