如何将异步Parse.com函数放在Swift中的单独类中?

时间:2015-06-08 05:37:24

标签: ios uiviewcontroller parse-platform

我正在使用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!)")
            }
        }
    }
}
}

1 个答案:

答案 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
}

你也可以处理回调错误,我只是发一个简单的例子