2014-09-04 82 views
1

我正在使用AFNetworking來獲取這樣的JSON數據,這很好。如何清除AFNetworking中的舊緩存?

SessionManager *sessionManager = [SessionManager sharedClient]; 
[sessionManager setResponseSerializer:[AFJSONResponseSerializer serializer]]; 
[sessionManager setRequestSerializer:[AFJSONRequestSerializer serializer]]; 

[sessionManager GET:urlString 
    parameters:nil 
    success:^(NSURLSessionDataTask *task, id responseObject) { 

     self.navigationItem.titleView = nil; 
     self.data = [responseObject objectForKey:@"courses"]; 
     self.title = responseObject[@"meta"][@"ref_title"]; 

    [self.tableView reloadData]; 
    } 
    failure:^(NSURLSessionDataTask *task, NSError *error) { 
     NSString *errorString = [NSString stringWithFormat:@"%@", 
           [error localizedDescription]]; 
     [aiView stopAnimating]; 
    }]; 

問題是我不想每次都加載數據。 所以我用

sessionManager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad; 

這允許更快的用戶體驗,但現在的問題是,數據永遠不會被刪除,或者是什麼呢?所以用戶可能沒有意識到有更新的數據可用。

爲此,我此刻的NSTimer,當應用程序被加載其開始使用,然後調用

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 

我覺得這是非常糟糕的溶液,作爲計時器將調用,即使數據被加載5方法幾秒鐘前。所以我問有沒有更好的?

我在這裏看到了類似的問題,但它是關於清除圖像緩存,並沒有關於緩存的年齡。對我來說最好的例子是,如果緩存可能會在日期發生變化時被刪除。

回答

0

你看過其他緩存策略嗎? NSURLRequestReloadRevalidatingCacheData看起來可能更適合您的需求。如果原始來源確認數據仍然有效,它將僅使用緩存數據。

+0

是的我也試過,它每次都從服務器重新加載。 – Pahnev 2014-09-05 00:02:40

+0

要避免移除5秒鐘前緩存的數據,可以使用:(void)removeCachedResponseForRequest:(NSURLRequest *)請求。如果是同一個請求,則可以有多次相同請求和備用實例。 – Kerstin 2014-09-05 00:30:39

0

那麼我決定在應用程序didFinishLaunchingWithOptions中進行日期檢查並將日期保存到NSUserDefaults。所以對我來說,我設置它,以便如果日期不匹配,我清除NSUserDefaults中的所有緩存和存儲的值。

如果我正確理解代碼,則應該只在用戶在第二天啓動應用程序時清除所有內容,這對我來說非常合適。

NSDate *dateCheck = [NSDate date]; 

NSDate *saveDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastStartDate"]; 
if (!saveDate) { 
    // This is the 1st run of the app 
    saveDate = [NSDate date]; 

    [[NSUserDefaults standardUserDefaults] setObject:saveDate forKey:@"lastStartDate"]; 
} 
NSLog(@"First run was on: %@", saveDate); 

NSInteger interval = [[[NSCalendar currentCalendar] components:NSCalendarUnitDay 
                 fromDate:saveDate 
                 toDate:dateCheck 
                 options:0] day]; 
if (interval < 0 || interval > 0) { 
    // Dates don't match lets remove cache and delete saveDate 
    [self removeAllCachedResponses]; 
    NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; 
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; 
} else { 
    // Dates are equal no need to do anything 
    NSLog(@"dates are same"); 
} 

正如你可以看到從我NSUserDefaults的刪除一切,因爲我不使用它做別的事情。你可能想爲你改變它。

編輯: 好日子改變了,所以我決定檢查這是否真的有效,答案是否定的。這是我的日誌

2014-09-10 16:00:30.626 SodexoMenuApp[4283:607] datecheck: 2014-09-10 21:00:30 +0000 
2014-09-10 16:00:30.627 SodexoMenuApp[4283:607] First run was on: 2014-09-09 23:02:02 +0000 

所以有些東西需要改變。有任何想法嗎?

編輯2: 我想我解決了這個問題。只是不得不改變組件:NSCalendarUnitDay