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

Posted

技术标签:

【中文标题】Swift,parse.com:如何从查询中传递数据【英文标题】:Swift, parse.com: how to pass data from query 【发布时间】:2014-06-29 09:42:15 【问题描述】:

我对 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

【问题讨论】:

这是因为该块异步运行在后台线程上(查看方法名称)。因为它是异步的,所以它会立即返回并继续执行它之后的代码。这意味着在上述代码块之前调用了第二个println(numObjects) 【参考方案1】:

不要使用异步运行的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.
    

【讨论】:

谢谢,它有效。但我收到警告:正在主线程上执行长时间运行的 Parse 操作。中断 warnParseOperationOnMainThread() 进行调试。【参考方案2】:

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

您的调用代码应该执行以下操作:

创建查询 以完成块开始查询 显示加载动画 返回(查询结果仍未知)

那你应该想想块的内部:

检查错误 更新 UI 绑定的值 告诉 UI 刷新

你不能有一个会返回计数的函数,但你可以编写一个函数,将完成块作为参数,并在查询完成块中执行它。不过这有点高级。

【讨论】:

【参考方案3】:

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

【讨论】:

那有什么解决办法。我的意思是,如果我们需要异步进行处理该怎么办。

以上是关于Swift,parse.com:如何从查询中传递数据的主要内容,如果未能解决你的问题,请参考以下文章

parse.com - 如何使用 PHP SDK 从 parse.com 查询和获取类似数组的 json?

从 Parse.com (Swift) 检索数据

如何将检索到的对象从 parse.com 传递到 NSMutableArray 以与 UITableView 一起使用?

添加和查询指针不适用于 Parse.com 的 REST API

从 Parse (Swift) 中检索图像到 imageView

parse.com swift - 在 tableView 单元格中取消固定和删除对象