2012-12-22 24 views
8

Tôi đang sử dụng AFNetworking trong ứng dụng của mình và cố gắng làm cho nó hoạt động ở chế độ ngoại tuyến bằng cách sử dụng dữ liệu được lưu trong bộ nhớ cache nếu có.Chế độ ngoại tuyến AFNetworking (AFHttpClient) không hoạt động với chính sách NSURLRequestReturnCacheDataDontLoad

Tôi mong đợi sau khi tôi đặt chính sách bộ nhớ cache yêu cầu thành NSURLRequestReturnCacheDataDontLoad, getPath: parameters: success: failure: sẽ thành công với dữ liệu đã lưu trong khi ngoại tuyến. Tuy nhiên, ngay cả khi có dữ liệu trong bộ nhớ cache (tôi xác minh bằng cách kiểm tra bộ nhớ cache với mã), getPath sẽ chỉ đơn giản là thất bại trong chế độ máy bay.

Có một chuỗi trong github AFNetworking: https://github.com/AFNetworking/AFNetworking/issues/378 Nhưng dường như vấn đề không được giải quyết chút nào. Tác giả của AFNetworking đơn giản trỏ đến Apple's document, và nó nói:

NSURLRequestReturnCacheDataDontLoad Specifies that the existing cache data should be used to satisfy a request, regardless of its age or expiration date. If there is no existing data in the cache corresponding to a URL load request, no attempt is made to load the data from the originating source, and the load is considered to have failed. This constant specifies a behavior that is similar to an “offline” mode.

Như Apple cho biết, NSURLRequestReturnCacheDataDontLoad được thiết kế chính xác cho chế độ ngoại tuyến.

Tôi đang thử nghiệm trong iOS6, tôi đã thử nghiệm với cả NSURLCache và SDURLCache, tất cả đều có cùng kết quả.

Các yêu cầu không thành, thông báo lỗi:

2012-12-22 03:11:18.988 Testapp[43692:907] error: Error Domain=NSURLErrorDomain Code=-1009 "The Internet connection appears to be offline." UserInfo=0x211b87c0 {NSErrorFailingURLStringKey=http://Testapp.com/api/v1/photo/latest/, NSErrorFailingURLKey=http://Testapp.com/api/v1/photo/latest/, NSLocalizedDescription=The Internet connection appears to be offline., NSUnderlyingError=0x211b9720 "The Internet connection appears to be offline."}

Trả lời

7

Hóa ra, đó là một lỗi trong iOS 6.

Có một chủ đề thảo luận trong AFNetworking chính xác cho vấn đề này: https://github.com/AFNetworking/AFNetworking/issues/566

Cảm ơn lời khuyên và thử nghiệm của guykogus về vấn đề này. Tôi đã trải qua một đêm về vấn đề này!

Một tóm tắt công việc xung quanh là đọc các phản hồi từ bộ nhớ cache, thay vì sử dụng chính sách NSURLRequestReturnCacheDataDontLoad:

NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request]; 
if (cachedResponse != nil && 
    [[cachedResponse data] length] > 0) 
{ 
    // Get cached data 
    .... 
} 
Các vấn đề liên quan