2009-12-05 10 views
7

Tôi đang sử dụng ASIHttpRequests và một ASINetworkQueue trong ứng dụng iPhone để truy xuất một số tệp XML 100k và rất nhiều hình thu nhỏ từ một dịch vụ web. Tôi muốn lưu trữ các yêu cầu theo kiểu NSURLCache. ASI dường như không hỗ trợ bộ nhớ đệm như là, và tôi nhìn vào mã và nó giảm xuống C để tạo ra các yêu cầu, do đó, chèn lớp NSURLCache có vẻ khó khăn.Tôi làm cách nào để thêm bộ nhớ đệm yêu cầu HTTP vào một ứng dụng bằng ASIHTTPRequests?

Cách tốt nhất để thực hiện điều này là gì?

Trả lời

0

NSURLConnection có hỗ trợ bộ nhớ đệm theo phong cách của NSURLCache và rất nhiều công việc cho bạn ở hậu trường. Nó thậm chí còn có một phương pháp đại biểu tốt đẹp mà sẽ cho phép bạn thao tác các cachedResponse:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse

1

Bạn có thể cung cấp bộ nhớ đệm của riêng bạn trước khi rơi xuống vào mã ASI.

Quấn đang ASI của bạn trong một lớp học có một phương pháp:

-(NSString *)getContentFor:(NSURL *)url

Đó là phương pháp đầu tiên kiểm tra một NSDictionary nội bộ để xem nếu nó có một món quà quan trọng đối với các url được chỉ định. Nếu có, nó trả về đối tượng được lưu trữ bằng khóa.

Nếu không, nó thực hiện ASIRequest bình thường. Khi yêu cầu được nhận từ máy chủ, nó lưu trữ nó như là một chuỗi trong từ điển của bạn với khóa của url.

Tất nhiên, bạn cần xử lý các yêu cầu không đồng bộ và hết hạn yêu cầu cũ.

1

Bất kỳ ai hỏi cách họ có thể thực hiện việc này với ASIHTTPRequest trực tiếp có thể quan tâm đến số branch của mã này thêm hỗ trợ cho tính năng này làm tùy chọn.

3

ASIHTTPYêu cầu hỗ trợ bộ nhớ đệm - hãy xem ASIDownloadCache tức là.

[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]] 
0

hãy thử điều này, nó phù hợp với tôi.

__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDownloadCache:[ASIDownloadCache sharedCache]]; 
    [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; 
    [request setCachePolicy:ASIAskServerIfModifiedWhenStaleCachePolicy]; 
    [request setSecondsToCache:60*60*24]; // Cache for 24 hrs 
    [request setDelegate:self]; // A delegate must be specified 
    [request setCompletionBlock:^{