在我的应用中,我有一个屏幕,用户可以在其中编辑对象的属性。屏幕有2个动作:保存或恢复。
选择还原时,我想将对象的属性还原为存储在服务器上的任何内容,并丢弃所有本地更改。我使用fetch方法执行此操作:
println("1: \(localObject)")
if localObject.isDirty() {
localObject.fetchInBackgroundWithBlock { serverObject, error in
println("2: \(localObject)")
println("3: \(serverObject)")
}
}
isDirty()
正常工作,只有在本地修改并且未保存的情况下才返回true。
根据文档,获取:fetches the PFObject with the current data from the server
。但是我在日志中看到的是,所有3个打印语句都显示相同的本地属性。我希望serverObject
是存储在服务器上的任何内容,但不是,serverObject
也会显示本地修改的属性。
我没有使用本地数据存储区。
发生了什么事?这是Parse SDK的错误吗?或者是否存在缓存问题?
答案 0 :(得分:2)
如果在不使用本地数据存储区的情况下调用fetch
,Parse将在控制台中显示错误。
由于您在致电fetchInBackgroundWithBlock
时没有从Parse收到错误,这意味着您在某个时候调用了localObject.pinInBackground()
并将该对象放在本地数据存储区中。
对于本地存储的对象,您可以在revert()
之前调用fetchInBackgroundWithBlock
以在从服务器更新数据之前丢弃本地更改。
if localObject.isDirty() {
localObject.revert()
localObject.fetchInBackgroundWithBlock { serverObject, error in
println("2: \(localObject)")
println("3: \(serverObject)")
}
}
答案 1 :(得分:0)
我还没有看过要获取的文档,但我知道您可以通过执行查询来完成您尝试的操作。执行以下操作将从服务器进行查询(尽管如果您已经使用查询首先查看缓存或网络,则可以调整缓存策略):
var query = PFQuery(className:"GameScore")
query.getObjectInBackgroundWithId("xWMyZEGZ") {
(gameScore: PFObject?, error: NSError?) -> Void in
if error == nil && gameScore != nil {
println(gameScore)
}else {
println(error)
}
}
或者,您可以在进行任何更改之前保存本地对象的副本,然后如果它是脏的,您只需将其替换为副本即可。这可能是我为减少解析API调用的数量所做的。