2015-08-16 44 views
1

我在緩存策略中沒有從緩存中獲取對象時遇到了一些問題。這裏是我打電話給我取對象的函數:沒有從緩存中獲取對象 - 解析

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

你是否執行過這個問題之前的查詢,你從網絡中提取數據然後在本地PINNED數據? – Loxx

+0

你說它沒有檢索任何數據。如果禁用緩存會怎麼樣?然後你的查詢檢索任何數據?如果'employerId'是一個引用或指針類型,那麼通常只會說'whereKey(「employerId」,equalTo:PFUser.currentUser()!)' – Paulw11

回答

1

下面是它的工作方式:

首先,從解析:

解析,您還可以存儲設備 本身在本地數據存儲對象。您可以將此數據用於不需要保存到 雲中的數據,但這對於臨時存儲數據以便稍後可以同步數據非常有用。要啓用數據存儲,請在調用 [解析setApplicationId:clientKey:]之前,在您的 AppDelegate應用程序:didFinishLaunchWithOptions中添加 libsqlite3.dylib並調用[解析enableLocalDatastore]:[解析setApplicationId:clientKey:]。一旦啓用本地數據存儲 ,就可以通過鎖定對象來存儲對象。

既然我們知道了這一點,那麼你必須PIN碼數據本地存儲,這是什麼意思呢:

let gameScore = PFObject(className:"GameScore") 
gameScore["score"] = 1337 
gameScore["playerName"] = "Sean Plott" 
gameScore["cheatMode"] = false 
gameScore.pinInBackground() 

然後中檢索它,你必須這樣做,也是從解析:

從本地數據存儲

存儲對象檢索對象是唯一有用的,如果你能找回來了。要獲得 特定對象的數據,可以使用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 
}) 

如果你得到了這個結尾,那麼你可能會很快發現,這個功能還是非常多的一個「黑匣子」。它可以工作,但是您可能會發現檢索數據會產生意想不到的結果。如果你真的擁有不需要刷新的數據,那麼一定要使用本地緩存,但是當你需要「獲取」和更新時,它會變得雜亂無章,並且確保你正確計時以便在更新時觸發必要。

+0

本地存儲的固定與緩存不同。如果存在高速緩存未命中的情況下進行高速緩存,則在此情況下將自動從網絡中檢索數據,因爲高速緩存策略爲「cacheElseNetwork」 – Paulw11

+0

實際上,您錯了,現在閱讀Parse SDK中的搜索,發現它是開源的正如我想的那樣,這些緩存機制調用相同的鎖定機制。感謝參與。 – Loxx

+0

緩存和固定使用本地存儲,但是如果本地數據存儲沒有明確啓用並且沒有明確執行固定(就像這個問題那樣),那麼您不需要執行您建議的操作在本地商店。你可以簡單地指定你想要的緩存選項,並讓Parse將它排除,因爲它一直做 – Paulw11