2016-06-17 1 views
-1

아래 함수를 사용하여 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"의 완료 블록 내에서 사용자 객체가 할당되지 않음을 의미). 누구든지 내 논리/구현이 잘못 된 것에 대한 단서가 있습니까? 미리 감사드립니다!

+0

무엇을 출력 대신 원하는 것을 출력하십시오. – iphonic

+0

당신은 [그 다른 대답] (http://stackoverflow.com/a/37887015/1271826)에서'makeUser'를 가져 왔지만 근본적인 점을 이해하지 못했기 때문에 비동기 메서드에서 값을 반환 할 수는 없습니다 (그리고'getUser'는 이제 비동기 메소드입니다). 비동기 메서드를 호출 할 때는 결과를 반환하지 말고 항상 완료 핸들러 패턴과 같은 비동기 프로그래밍 패턴을 따르십시오. – Rob

+0

"makeUser"의 완료 블록 내에서 사용자 개체가 할당되지 않습니다. 아니요, 값을 얻지 만, 나중에'viewDidLoad'가 이미 끝난 후에 말이에요. 'viewDidLoad'가 아니라 완료 블록에서만 값을 사용할 수 있습니다. – Rob

답변

0

당신은 예를

func makeUser(first: String, last: String, email: String, completion:((User?) -> Void)) { 

    userCreationCall(first, last: last, email: email) { user, error in 
    guard error == nil else { 
     print("Error creating a user! : \(error)") 
     completion(nil) 
     return 
    } 

    completion(user) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    makeUser("John", last: "Doe", email: "[email protected]") { user in 
     if user != nil { 
      print("\(user!)") 
     } 
    } 
} 

에 대한 makeUser도 완료 블록이 필요하지만 추가 기능이 실제로 필요하지 않습니다

override func viewDidLoad() { 
    super.viewDidLoad() 

    userCreationCall("John", last: "Doe", email: "[email protected]") { user, error in 
     if error != nil { 
     print("Error creating a user! : \(error!)") 
     } else { 
     print("\(user!)") 
     // do something with the new created user 
     } 
    } 
} 
당신은 너무과 makeUser``에 완료 핸들러를 사용한다
+0

그래서 내 앱을 로컬 사용자 변수로 만들 때 userCreationCall (즉 사용자)에서 얻은 정보를 어떻게 사용할 수 있을까요? "userCreationCall"을 호출하기 직전에 생성 된 "비어있는"초기화되지 않은 사용자가 있어야하고, 완료 블록에서 호출 한 데이터를 사용하여 "빈"사용자에게 속성을 할당해야합니까? –

+0

정확히, 데이터가 비동기 적으로 검색되므로 완료 블록에 값을 지정해야합니다. – vadian

+0

좋습니다. 나는이 블록에 "사용자 수익"을 통합 할 수있는 방법을 찾고 있기 때문에 여전히 고심하고 있습니다. 근본적으로 내가하려는 일은 프론트 엔드 사람들이 "makeUser"를 호출하고, 기본 정보를 전달하고, 완료에 대해 걱정할 필요없이 서버에서 데이터로 얻은 User 객체를 가져올 수있게 허용하는 것입니다 블록 또는 백엔드 구현. 이 구현 방법에 대한 제안? –

관련 문제