簡體   English   中英

使用NSCoding緩存數據?

[英]Caching data with NSCoding?

在我的應用程序中,我從服務器檢索URL數據。 作為一種優化,我通過將數據存儲到自定義類中來規范化數據,以便以后可以快速訪問數據。 但是,我需要在本地和離線存儲此類的一個實例,以便避免已經從服務器檢索數據的情況。 另外,網站每天都在變化,因此緩存的數據僅在同一天才有用。

這種情況適用於2個單獨的類(總共4個對象),我嘗試像這樣用NSCoding保存此數據。 (到目前為止,我僅嘗試實現1個對象,但我計划為每個對象創建一個單獨的docPath)

- (void) saveStateToDocumentNamed:(NSString*)docName
{
    NSError       *error;
    NSFileManager *fileMan = [NSFileManager defaultManager];
    NSArray       *paths   = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString      *docPath = [paths[0] stringByAppendingPathComponent:docName];

    if ([fileMan fileExistsAtPath:docPath])
        [fileMan removeItemAtPath:docPath error:&error];

    // Store the hours data
    Hours *h = [self parseHoursFromServer];
    NSDictionary *state = [NSDictionary dictionaryWithObjectsAndKeys:h, @"Hours", nil];

    // There are many ways to write the state to a file. This is the simplest
    // but lacks error checking and recovery options.
    [NSKeyedArchiver archiveRootObject:state toFile:docPath];
    NSLog(@"end");
}

- (NSDictionary*) stateFromDocumentNamed:(NSString*)docName
{
    NSError       *error;
    NSFileManager *fileMan = [NSFileManager defaultManager];
    NSArray       *paths   = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString      *docPath = [paths[0] stringByAppendingPathComponent:docName];

    if ([fileMan fileExistsAtPath:docPath])
        return [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];

    return nil;
}

但是,當我嘗試運行此代碼時,我收到了[Hours encodeWithCoder:]: unrecognized selector sent to instance 0因為我的類當前不支持NSCoding。 了解了如何為自定義類手動編碼所有屬性后,我想確保NSCoding是解決數據緩存問題的理想解決方案。

編輯:

這是我目前創建網址的方式

NSURL *url = [NSURL URLWithString:urlString];
NSData *pageData = [NSData dataWithContentsOfURL:url];

TL; DL; 系統已經在為您緩存!

發出請求時,URL加載系統將檢查共享URL緩存,以查看緩存中是否存在有效的匹配響應。 如果存在,它將使用它而不是建立網絡連接。 這對於您的網絡代碼是透明的,無論從緩存或網絡中獲取數據,它的工作方式都相同。 除了告訴NSURLCache使用磁盤之外,您無需執行任何其他操作:

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:(4 * 1024 * 1024) diskCapacity:(20 * 1024 * 1024) diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];

這樣一來,它就可以使用4MB RAM,20MB磁盤和默認的緩存位置在磁盤上。 當您的應用程序啟動時,應該執行一次。 從那時起, NSURLCache會將所有可緩存的網絡響應寫入內存以及磁盤。 當它們到期或緩存用完空間時,它們將被刪除。 網絡連接如何使用緩存由NSURLRequestcachePolicy NSURLRequestUseProtocolCachePolicy的默認值根據協議(HTTP)的規則使用緩存。 HTTP響應包含有關響應應被視為有效的時間的信息,並且該策略遵守這些規則。 在大多數情況下,這可以正常工作-除非與您通信的服務器錯誤地實現了HTTP響應緩存信息。 如果要更改緩存策略以不允許URL加載系統嘗試從網絡加載任何內容,則僅在設備的無線電處於脫機狀態時才這樣做。 如果設備處於飛行模式,則可以使用其他緩存策略來構造NSURLRequest (假設您正在使用“可達性”來確定網絡狀態):

if (networkStatus == NotReachable){
    request = [[NSURLRequest alloc] initWithURL:someURL cachePolicy: NSURLRequestReturnCacheDataDontLoad timeoutInterval:timeout];
} else {
    request = [[NSURLRequest alloc] initWithURL:someURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:timeout];
}

如果設備處於飛行模式,或者蜂窩電話或wifi都沒有信號,則將使用策略NSURLRequestReturnCacheDataDontLoad NSURLRequestReturnCacheDataDontLoad將加載來自緩存的響應(即使已過期),並且不會嘗試訪問不在緩存中的項目的網絡。

您可以在《 URL加載系統編程指南:了解緩存訪問》中閱讀有關此內容的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM