我遇到了一些缓存策略问题,它没有从缓存中获取对象。这是我调用以获取对象的函数:
func findEmployeeForLoggedInUser(completion: (array: [AnyObject], error: String?) -> Void) {
if PFUser.currentUser() != nil {
let query = PFQuery(className: "Employee")
query.cachePolicy = PFCachePolicy.cacheElseNetwork
query.whereKey("employerId", equalTo: PFUser.currentUser()!.objectId!)
query.findObjectsInBackgroundWithBlock { (results, error) -> Void in
var employeeArray = [PFEmployee]()
if let error = error {
let errorString = error.userInfo?["error"] as? String
completion(array: employeeArray, error: errorString)
} else {
for employee in results! {
let currentEmployee: PFEmployee = employee as! PFEmployee
employeeArray.append(currentEmployee)
}
completion(array: employeeArray, error: nil)
}
}
}
}
在此函数的正文中,我已将PFQuery
的缓存策略声明为cacheElseNetwork
。但是,当我尝试通过调用此函数来检索我的对象时,它不能完全工作,因为它不检索数据。我还禁用了Parse本地数据存储区。此外,每次用户重新登录时,我都会清除所有缓存的结果。
如何解决此问题?
答案 0 :(得分:1)
这是它的工作方式:
首先,来自Parse:
Parse还允许您将对象存储在设备上的本地数据存储中 本身。您可以将此用于不需要保存到的数据 云,但这对临时存储数据特别有用 它可以在以后同步。要启用数据存储,请添加 libsqlite3.dylib并在你的。中调用[Parse enableLocalDatastore] AppDelegate应用程序:didFinishLaunchWithOptions:在调用之前 [解析setApplicationId:clientKey:]。一旦本地数据存储区 启用后,您可以通过固定来存储对象。
既然我们知道这一点,那么你必须将数据密码到本地存储,这就是这意味着:
let gameScore = PFObject(className:"GameScore")
gameScore["score"] = 1337
gameScore["playerName"] = "Sean Plott"
gameScore["cheatMode"] = false
gameScore.pinInBackground()
然后要进行检索,你必须这样做,也来自Parse:
从本地数据存储中检索对象
存储对象仅在您可以将其取出时才有用。要得到 对于特定对象的数据,您可以像您一样使用PFQuery 会在网络上,但使用fromLocalDatastore方法 告诉它从哪里获取数据。
然后这个:
let query = PFQuery(className:"GameScore")
query.fromLocalDatastore()
query.getObjectInBackgroundWithId("xWMyZ4YEGZ").continueWithBlock({
(task: BFTask!) -> AnyObject! in
if task.error != nil {
// There was an error.
return task
}
// task.result will be your game score
return task
})
然后这也来自解析:
如果您已经拥有该对象的实例,则可以改为使用 fetchFromLocalDatastoreInBackground方法。
然后这个:
let object = PFObject(withoutDataWithClassName:"GameScore", objectId:"xWMyZ4YEGZ")
object.fetchFromLocalDatastoreInBackground().continueWithBlock({
(task: BFTask!) -> AnyObject! in
if task.error != nil {
// There was an error.
return task
}
// task.result will be your game score
return task
})
如果你到了最后,那么你很快就会发现这个功能仍然是一个“黑匣子”。它可以工作,但您可能会发现检索数据会产生意外结果。如果您确实拥有不需要刷新的数据,那么请务必使用本地缓存,但是当您需要“获取”并更新并确保正确计时以在更新时触发时,它会变得有点混乱必要的。