【发布时间】:2015-07-16 23:20:15
【问题描述】:
问题:当我在 ViewController tableView cellForRowAtIndexPath 方法中调用以下函数时,我得到 nil,但我需要将生成的对象设置为我在 ViewController 中全局声明的名为 rankObject 的 PFObject 变量。我已经尝试了很多东西,包括完成处理程序,但仍然卡住了。我将如何完成这项任务?
func getOrMakeRankRelations(sound: PFObject) {
var rankRelation = sound.relationForKey("userRanks")
let currentUser = PFUser.currentUser()!
var relationQuery = rankRelation.query()
relationQuery?.whereKey("user", equalTo: currentUser)
relationQuery?.findObjectsInBackgroundWithBlock { (theObject: [AnyObject]?, error: NSError?) -> Void in
if (theObject?.isEmpty == true) {
println("Rank object is empty")
//Make Ranking PFObject
var ranking = PFObject(className: "Ranking")
ranking["user"] = PFUser.currentUser()!
ranking["Rank"] = 0
//Upload ranking to Parse
ranking.saveInBackgroundWithBlock { (saved: Bool, error: NSError?) -> Void in
if saved {
println("Saved ranking")
//Add relation between sound and ranking
rankRelation.addObject(ranking)
sound.saveInBackgroundWithBlock { (saved: Bool, error: NSError?) -> Void in
if saved {
println("Saved relation")
var theObject = (theObject![0] as? PFObject)!
self.rankObject = theObject //////////NOTE: the variable saves while in this closure /////////////
} else {
println("Relation not saved :(")
}
}
} else {
println(error)
}
}
} else {
var theObject = (theObject![0] as? PFObject)!
self.rankObject = theObject //////////NOTE: the variable also saves while in this closure /////////////
}
}
}
这是我在 tableView 中调用函数的方式:
getOrMakeRankRelation(sound)
【问题讨论】:
-
在xcode中,您可以将光标放在
saveInBackgroundWithBlock上,右键单击,然后选择“跳转到定义”。您将看到 parse 如何声明该异步函数以获取块参数。你可以(应该对你的 getOrMakeRankRelation 函数做同样的事情。它的返回值毫无价值,因为真正的工作在它返回后才完成。它需要一个自己的完成块。 -
在您从 cellForRowAtIndexPath 调用它之前,请考虑它会在用户滚动时触发无数网络请求。要为表提供服务,您需要一个数组数据源。在向网络询问数据之前,请查看它是否在您的本地阵列中。在向网络询问某些内容后,将其放入本地阵列中。从这个意义上说,您的数据源是从 parse 检索到的对象的本地缓存。
-
是的,绝对不要保存
cellForRowAtIndexPath的东西。 -
尝试在您的视图控制器与之对话的另一个控制器中保存和获取。
-
@danh,你能提供关于我将如何实现你的第一条评论的代码吗?我发现令人困惑的是,我有另一个非常相似的函数,它没有完成块,并且可以很好地将值存储在函数外部的数组中。另外,请注意您的第二条评论,我将相应地修改功能,谢谢。
标签: ios swift parse-platform completionhandler