函数在返回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完成块中进行了调用,但不幸的是,我仍然遇到相同的问题。然后您应该编辑您的问题,或者更好,创建新问题,并向我们展示您调用的方法。如果不知道你在做什么,不知道你正在经历什么样的行为,就不可能进行诊断,例如你犯了什么错误或者你犯了什么错误。