Swift,parse.com:如何从查询中传递数据

时间:2014-06-29 09:42:16

标签: ios parse-platform swift

我对parse.com有这样的疑问。 为什么numObjects变量在findObjectsInBackgroundWithBlock和函数退出中具有不同的值

func searchUserInParse () -> Int {

    var numObjects : Int = 0 // the num return objects from query

    var query = PFQuery(className:"Bets")
    query.whereKey("user", equalTo: "Bob")
    query.findObjectsInBackgroundWithBlock {
        (objects: AnyObject[]!, error: NSError!) -> Void in
        if !error {
            numObjects = objects.count
            println(numObjects) // at this point the value = 1
        } else {
            // Log details of the failure
            NSLog("Error: %@ %@", error, error.userInfo)
        }
    }
    println(numObjects) // at this point the value = 0

    return numObjects
}

3 个答案:

答案 0 :(得分:4)

不要使用异步运行的findObjectsInBackgroundWithBlock,而是尝试使用同步运行的findObjects

//Set up query...
var objects = query.findObjects()
numObjects = objects.count
println(numObjects)

然后在运行你的功能时,这样做:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) {
    //Search users
    searchUserInParse()

    dispatch_async(dispatch_get_main_queue()) {
        //Show number of objects etc.
    }
}

答案 1 :(得分:2)

这是异步代码的本质,你的函数将运行外部代码完成,然后一段时间后(取决于连接速度和查询复杂性)完成块将运行。

您的主叫代码应该执行以下操作:

  • 创建查询
  • 使用完成块启动查询
  • 显示加载动画
  • 返回(查询结果仍然未知)

然后你应该考虑一下这个街区的内部:

  • 检查错误
  • 更新UI绑定的值
  • 告诉用户界面刷新

您不能拥有一个将返回计数的函数,但您可以编写一个将完成块作为参数的函数,并在查询完成块中执行它。但这有点先进。

答案 2 :(得分:1)

query.findObjectsInBackgroundWithBlock将以异步方式执行,在获取对象后调用完成块。因此,首先调用的块之后的代码numObjects值为0。