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 传递到 NSMutableArray 以与 UITableView 一起使用?
添加和查询指针不适用于 Parse.com 的 REST API