2015-05-22 41 views
1

我將我的PFQuery對象的緩存策略設置爲kPFCachePolicyCacheThenNetwork,但緩存始終保持爲空。有人能幫我解決發生了什麼事嗎?PFQuery緩存始終爲空

下面的代碼返回緩存的結果空

-(void)doSomeQuery 
{ 
    PFQuery *query = [PFQuery queryWithClassName:kMySpecialClass]; 
    [query whereKey:kDateExpires greaterThan:[NSDate date]]; 
    query.cachePolicy = kPFCachePolicyCacheThenNetwork; 
    NSLog(@"CACHED ? = %i",[query hasCachedResult]);//Nope, no matter what returns NO 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 


    NSLog(@"RETURNED: %@", objects);//1st cache (null) then network gets the data 

    }]; 

} 

回答

1

爲了獲得緩存的結果,查詢需要匹配(或等於)先前查詢結果被緩存的位置。該問題中發佈的查詢每次都有所不同,因爲它的限定條件是[NSDate date]

爲確保查詢具有緩存的結果,請保留相同的PFQuery對象。如果你設置了kPFCachePolicyCacheThenNetwork,並且第二次運行find ...,你會得到一個緩存的結果。

編輯 - 解決此問題取決於系統對時間的敏感程度。讓我們來看看這個問題:給我未過期的MySpecialClass實例,未來的未來意味着到期。

讓我們以本地緩存的用法來表示,我希望有時可以進行快速查詢和/或離線操作,並且我願意相對於服務器上的內容交易真相(也許服務器不會獲得新的無論如何,經常使用MySpecialClass的實例)。

在一定程度上,這些東西都是真實的,你可以有兩種類型的查詢解決的OP問題:

1)刷新查詢,完成次數減少,這吹走緩存,並獲取最新的未到期從服務器的東西。此查詢完全按照OP代碼實現,但使用默認緩存策略:僅限網絡。

2)維護查詢更頻繁,依賴於緩存,但運行速度快且脫機。這個查詢仍然希望省略我的特殊類的過期實例,但我們在查詢後的代碼中執行此操作。實現此查詢是堅持一個屬性(至少在執行過程中,可能執行之間,但是這是一個不同的主題),並使用高速緩存則網絡如下:

@property (strong) PFQuery *maintenanceQuery; 

// lazily init 
- (PFQuery *)maintenanceQuery { 
    if (!_maintenanceQuery) { 
     // op code, including cachePolicy = kPFCachePolicyCacheThenNetwork; 
    } 
    return _maintenanceQuery; 
} 

// based on some timing decision, either run the refresh query or... 
- (void)runMaintenanceQuery:(void (^)(NSArray *, NSError *))completion { 
    [self.maintenanceQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     NSDate *now = [NSDate date]; 
     NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(PFObject *mySpecialInstance, NSDictionary *bind){ 
      NSDate *expiration = [mySpecialInstance valueForKey:kDateExpires]; 
      return now == [expiration earlierDate:now]; 
     }]; 

     NSArray *unexpired = [objects filteredArrayUsingPredicate:predicate]; 
     completion(unexpired, error); 
    }]; 
} 

關於什麼的高速緩存,則─不錯網絡功能是,在連接的情況下,您的維護查詢仍然與服務器保持相對最新,因爲在查詢之後,默默無聞地(如果可能)真正的查詢已經完成,並且出現新的實例。當然,有些會過期,因爲時間已經推進了,但之後我們會用內存中的過濾器來處理。

+0

謝謝@danh任何解決這個問題?除本地數據存儲外 – fzkl

+0

@fzkl - 當然。回答不太簡單,但我做得最好。 – danh

+0

非常感謝@danh – fzkl

0

根據文檔,kPFCachePolicyCacheThenNetwork不應從緩存中返回,第一次所有的時間。第一次在返回之前它應該擊中網絡。可能是你有不好的緩存數據或什麼?

  • 你還可以確認查詢返回正常,但不設置cachePolicy嗎?

  • 其他選項是嘗試從設備上刪除應用程序並再次運行,以便清除緩存。如果設備上存在緩存數據不佳的問題。

+0

感謝您的迴應,但它首先從緩存中返回,然後返回文檔中所述的網絡。查詢總是返回,但緩存將爲空。CacheThenNetwork:查詢首先從緩存中加載,然後從網絡加載。在這種情況下,回調實際上會被調用兩次 - 首先是緩存結果,然後是網絡結果。 – fzkl