函数在返回Swift后赋值

函数在返回Swift后赋值,swift,function,closures,Swift,Function,Closures,我遇到了一个奇怪的错误,我的函数在返回后向数组追加一个值。。。代码如下: func makeUser(first: String, last: String, email: String) -> [User] { var userReturn = [User]() RESTEngine.sharedEngine.registerUser(email, firstName: first, lastName: last, age: 12, success: { respon

我遇到了一个奇怪的错误,我的函数在返回后向数组追加一个值。。。代码如下:

func makeUser(first: String, last: String, email: String) -> [User] {

    var userReturn = [User]()

    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)

            userReturn.append(user)
            print("\(userReturn)")

        }
        }, failure: { error in
            print ("Error creating a user on the server: \(error)")
    })

    return userReturn
}
我从这里调用make user:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    var newUser = makeUser("Average", last: "Person", email: "a.Person@mail.com")
    print("\(newUser)")
}
这些都还在测试中,所以我显然是在奇怪的地方调用我的代码

因此,当我运行这个函数时,结果是首先打印我的newUser数组,它显示为空,然后打印我在makeUser函数中本地分配的userReturn数组,它包含我在registerUser的success completion块中附加到它的新用户,如下所示:

有人知道这里发生了什么吗?我怎样才能解决它

仅供参考:JSON只是我为[String:AnyObject]字典定义的类型别名

registerUser异步运行,因此您应该应用异步模式,例如完成处理程序:

func makeUser(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"] {
            var users = [User]()

            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)
            users.append(user)

            completionHandler(users, nil)
        } else {
            let jsonError = ...  // build your own ErrorType or NSError indicating that the the parsing of the JSON failed for some reason
            completionHandler(nil, jsonError)
        }
    }, failure: { error in
        completionHandler(nil, error)
    })
}
并像这样使用它:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    makeUser("Average", last: "Person", email: "a.Person@mail.com") { users, error in
        guard error == nil else {
            print(error)
            return
        }

        print("\(users)")
        // if you're doing anything with this, use it here, e.g. reloadTable or update UI controls
    }

    // but don't try to use `users` here, as the above runs asynchronously
}

因为RESTEngine.sharedEngine.registerUser是异步运行的?当发送实际请求时,它是异步的,但这不是需要发生的吗?异步意味着它阻止代码继续进行,并确保在继续之前有某种形式的响应,不?@DavidTamrazov-不,它的意思正好相反。这意味着当请求异步运行时,它不会停止当前线程。因此,您不能或至少不应该尝试返回该值。你需要采用异步模式。啊,好吧,我明白了,我不知道异步调用必须通过完成块来处理。谢谢你,罗布!因此,如果在上面的makeUser的完成块中,如果我想返回我创建的新用户对象,我是否需要将其传递给另一个函数?@DavidTamrazov-那么你应该将对另一个函数的调用放在makeUser的完成块中,例如,我在这里说,如果你正在使用这个函数,在这里使用它…我创建了这样一个函数,并在makeUser完成块中进行了调用,但不幸的是,我仍然遇到相同的问题。然后您应该编辑您的问题,或者更好,创建新问题,并向我们展示您调用的方法。如果不知道你在做什么,不知道你正在经历什么样的行为,就不可能进行诊断,例如你犯了什么错误或者你犯了什么错误。