不从缓存中获取对象 - Parse

时间:2015-08-16 01:15:59

标签: ios swift caching parse-platform

我遇到了一些缓存策略问题,它没有从缓存中获取对象。这是我调用以获取对象的函数:

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本地数据存储区。此外,每次用户重新登录时,我都会清除所有缓存的结果。

如何解决此问题?

1 个答案:

答案 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
})

如果你到了最后,那么你很快就会发现这个功能仍然是一个“黑匣子”。它可以工作,但您可能会发现检索数据会产生意外结果。如果您确实拥有不需要刷新的数据,那么请务必使用本地缓存,但是当您需要“获取”并更新并确保正确计时以在更新时触发时,它会变得有点混乱必要的。