我正在使用Parse.com作为我的后端。我想将所有与访问Parse.com相关的函数/代码放在一个可以从不同的ViewControllers调用的类中。
问题在于 - 由于Parse.com中的许多功能都是异步,如何从这些函数返回值来更新UI?
例如,在以下功能中,我将获取当前用户的收入信息。由于此函数使用parse.com中的异步方法findObjectsInBackgroundWithBlock,因此无法从此函数返回任何内容。
这个问题有解决方法吗?目前,我不得不将它放在同一个ViewController类中。 (因此必须在多个viewControllers中重复这个相同的功能。希望只在一个函数中使用它)
我看到的唯一解决方案是转到同步方法findObjects。还有其他方法吗?
func getcurrUserEarnings() {
/// Get details of currentUser from Earnings Class
///
/// :param - NSInterval
/// :returns - Int
func loadEarningsInfo() {
if (PFUser.currentUser() != nil) {
var query = PFQuery(className:"Earnings")
query.whereKey("user", equalTo: PFUser.currentUser()!)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
if let objects = objects as? [PFObject] {
for object in objects {
println(object.objectId)
//WANT TO UPDATE UI HERE WITH THE VALUES THAT WERE JUST RETURNED
}
}
} else {
// Log details of the failure
println("Error: \(error!) \(error!.userInfo!)")
}
}
}
}
}
答案 0 :(得分:1)
您可以使用回调来传递内容。
例如:
func doSomething(callBack:(String)->())->(){
callBack("abc")
}
doSomething { (str:String) -> () in
println(str)
}
另外,不要忘记更新主线程上的UI
例如
func loadEarningsInfo(callBack:([PFObject])->()) {
if (PFUser.currentUser() != nil) {
var query = PFQuery(className:"Earnings")
query.whereKey("user", equalTo: PFUser.currentUser()!)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
if let objects = objects as? [PFObject] {
callBack(objects)
}
} else {
// Log details of the failure
println("Error: \(error!) \(error!.userInfo!)")
}
}
}
}
然后当你使用
loadEarningsInfo { (objects:[PFObject]) -> () in
//Update UI with objects
}
你也可以处理回调错误,我只是发一个简单的例子