【问题标题】:Not fetching object from cache - Parse不从缓存中获取对象 - 解析
【发布时间】:2015-11-08 22:38:03
【问题描述】:

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

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

我该如何解决这个问题?

【问题讨论】:

  • 在从网络中提取数据然后在本地固定数据的查询之前,您是否执行过查询?
  • 你说它没有检索任何数据。如果禁用缓存怎么办?那么您的查询是否检索到任何数据?如果employerId 是引用或指针类型,那么您通常只会说whereKey("employerId", equalTo:PFUser.currentUser()!)

标签: ios swift caching parse-platform


【解决方案1】:

这是它的工作方式:

首先,来自 Parse:

Parse 还允许您将对象存储在设备上的本地数据存储中 本身。您可以将其用于不需要保存到 云,但这对于临时存储数据特别有用 以后可以同步。要启用数据存储,请添加 libsqlite3.dylib 并调用 [Parse enableLocalDatastore] 在您的 AppDelegate 应用程序:didFinishLaunchWithOptions:调用之前 [解析 setApplicationId:clientKey:]。一旦本地数据存储 启用后,您可以通过固定对象来存储它。

既然我们知道了这一点,那么您必须将您的数据 PIN 到本地存储,这就是这意味着:

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

如果你走到了尽头,那么你可能很快就会发现这个功能在很大程度上仍然是一个“黑匣子”。它确实有效,但您可能会发现从检索数据中得到了意想不到的结果。如果您确实有不需要刷新的数据,那么一定要使用本地缓存,但有时当您需要“获取”和更新并确保您正确计时以在更新时触发时,它会变得有点混乱必要的。

【讨论】:

  • 使用本地存储固定与缓存不同。如果缓存未命中,则在这种情况下,将自动从网络中检索数据,因为缓存策略为cacheElseNetwork
  • 实际上,Paul,你错了,现在通过 Parse SDK 阅读搜索,因为它是开源的,并且正如我所想,这些缓存机制调用相同的固定机制。感谢您的参与。
  • 缓存和固定使用本地存储,但如果本地数据存储未显式启用且未显式执行固定(如本问题中的情况),则不需要执行您在本地商店建议的操作。您可以简单地指定所需的缓存选项,然后让 Parse 像往常一样对其进行排序
  • 但是,这是相同的机制,它们都是固定的
  • 不,他们没有。如果你明确地固定一个对象,那么你将总是得到本地对象(相当于kPFCachePolicyCacheOnly)。
猜你喜欢
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
相关资源
最近更新 更多