2013-11-02 74 views
6

在我的項目中,我正在使用AFNetworking從網上下載數據。我在我的NSURLRequest上利用NSURLRequestUseProtocolCachePolicy來爲用戶緩存的數據提供服務(如果緩存有效)。這是我的代碼:AFNetworking和響應緩存處理

請求方法:

// create NSURL request 
NSURLRequest *request = [ServerFactory URLGETRequestWithURL:url]; 

//creating AFHTTPRequestOperation 
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

//set serializaer 
operation.responseSerializer = [AFJSONResponseSerializer serializer]; 

//need to specify that text is acceptable content type, otherwise the error occurs 
operation.responseSerializer.acceptableContentTypes = [MyRepository acceptableContentTypes]; 

//running fetch request async 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    //parse data 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    //error handling 
}]; 

//start async operation 
[operation start]; 

可接受的內容類型的方法

+ (NSSet *)acceptableContentTypes 
{ 
    return [NSSet setWithObjects:@"application/json", @"text/plain", @"text/html" ,nil]; 
} 

ServerFactory get方法

+ (NSURLRequest *)URLGETRequestWithURL:(NSString *)URL 
{ 
    NSMutableURLRequest *request = [[ServerFactory URLRequestWithURL:URL] mutableCopy]; 
    [request setCachePolicy:NSURLRequestUseProtocolCachePolicy]; 
    [request setHTTPMethod:@"GET"]; 
    return request; 
} 

+ (NSURLRequest *)URLRequestWithURL:(NSString *)URL 
{ 
    // creating NSURL to give to NSURLRequest 
    NSURL *theURL = [NSURL URLWithString:URL]; 

    //adding service version in http header 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:theURL]; 
    [request addValue:HTTP_HEADER_VERSION_VALUE forHTTPHeaderField:HTTP_HEADER_VERSION_NAME]; 

    //returing request 
    return request; 
} 

現在我想過渡到新的邏輯:

  • 獲取緩存的數據
  • 如果高速緩存的數據有效
    • 即成用戶與高速緩存的數據
    • 調度用的If-Modified-Since標題設置爲檢索緩存的數據時間戳
    • 服務器respondes 304未修改新請求如果高速緩存還行,或200行,如果有新的數據
    • 更新UI與新的數據
  • 如果緩存中的數據前pired
    • 從網絡

獲取新信息的數據所以基本上我想成爲高速緩存的數據,但檢查我的緩存數據仍然在服務器上有效或是否有新的數據下載。有沒有辦法做到這一點?我嘗試setCacheResponseBlockAFHTTPRequestOperation但我無法獲得緩存的數據時間戳。有沒有一種「更聰明」的方式來做到這一點?

+0

我正在使用AFNetworking 2.0 – paxx

+0

看看這個主題,它可能會幫助你:http://stackoverflow.com/a/21556002/514181 – Darrarski

回答