为AFNetworking 3.x实现自定义缓存

黎庆荣

嗨,我正在编写一个iOS API,以使用AFNetworking 3.x从服务器获取数据。我的服务器不支持缓存。这个服务器头

Connection →Keep-Alive
Content-Length →4603
Content-Type →text/html; charset=UTF-8
Date →Wed, 10 Aug 2016 04:03:56 GMT
Keep-Alive →timeout=5, max=100
Server →Apache/2.4.18 (Unix) OpenSSL/1.0.1e-fips PHP/5.4.45
X-Powered-By →PHP/5.4.45

我想构建自定义API以启用缓存(例如,请求和响应应缓存10秒钟,以便如果用户发出相同的请求,则使用缓存数据。如果缓存过期的应用程序将再次重新下载)

我的AFNetworking单身汉

#pragma mark - Shared singleton instance

+ (ApiClient *)sharedInstance {
    static ApiClient *sharedInstance = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
        sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithString:SINGPOST_BASE_URL] sessionConfiguration:sessionConfiguration];

    return sharedInstance;
}

- (id)initWithBaseURL:(NSURL *)url
{
    if ((self = [super initWithBaseURL:url])) {
        self.requestSerializer = [AFHTTPRequestSerializer serializer];
    }
    return self;
}

我的JSON请求

- (void)sendJSONRequest:(NSMutableURLRequest *)request
                success:(void (^)(NSURLResponse *response, id responseObject))success
                failure:(void (^)(NSError *error))failure {

    self.responseSerializer.acceptableContentTypes = [AFHTTPResponseSerializer serializer].acceptableContentTypes;
    self.requestSerializer.timeoutInterval = 5;
    self.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

        [self setDataTaskWillCacheResponseBlock:^NSCachedURLResponse * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionDataTask * _Nonnull dataTask, NSCachedURLResponse * _Nonnull proposedResponse) {
            return [[NSCachedURLResponse alloc] initWithResponse:proposedResponse.response
                                                            data:proposedResponse.data
                                                        userInfo:proposedResponse.userInfo
                                                   storagePolicy:NSURLCacheStorageAllowed];
        }];

    NSURLSessionDataTask *dataTask = [ApiClient.sharedInstance dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error) {
            NSLog(@"Error URL: %@",request.URL.absoluteString);
            NSLog(@"Error: %@", error);
            failure(error);
        } else {
            NSDictionary *jsonDict  = (NSDictionary *) responseObject;
            success(response,jsonDict);
            NSLog(@"Success URL: %@",request.URL.absoluteString);
            NSLog(@"Success %@",jsonDict);
        }
    }];
    [dataTask resume];

}

如何修改下面的代码以启用缓存请求和响应(我希望响应保持10秒钟左右)(如果没有互联网连接,则希望保留1天),非常感谢您的帮助。谢谢!

[self setDataTaskWillCacheResponseBlock:^NSCachedURLResponse * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionDataTask * _Nonnull dataTask, NSCachedURLResponse * _Nonnull proposedResponse) {
            return [[NSCachedURLResponse alloc] initWithResponse:proposedResponse.response
                                                            data:proposedResponse.data
                                                        userInfo:proposedResponse.userInfo
                                                   storagePolicy:NSURLCacheStorageAllowed];
        }];
加特伍德

代替

            return [[NSCachedURLResponse alloc] initWithResponse:proposedResponse.response

            NSMutableDictionary *dictionary = [proposedResponse.response.allHeaderFields mutableCopy];
            dictionary[@"Cache-Control" = ...
            NSHTTPURLResponse *modifiedResponse =
              [[NSHTTPURLResponse alloc initWithURL:proposedResponse.response.URL
                                         statusCode:proposedResponse.response.statusCode
                                        HTTPVersion:@"HTTP/1.1"
                                       headerFields:modifiedHeaders];

            [modifiedResponse 
            return [[NSCachedURLResponse alloc] initWithResponse:modifiedResponse

请注意,无法从原始请求中检索HTTP版本。我很确定我已经提交了一个有关此问题的错误。我也很确定它对任何东西都没有任何影响,而且我认为它甚至都不会存储在基础对象中,因此可能无关紧要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为融合的kafka-connect-s3实现自定义AvroConverter

来自分类Dev

为自定义UICollectionviewCell实现countbyenumeratingwithstate

来自分类Dev

具有Ehcache 3.x的Spring Boot 2.x-自定义CacheEventListener中的@Autowired服务为null

来自分类Dev

Swift3中的自定义对象的缓存数组

来自分类Dev

如何为OkHttp3实现自定义DNS

来自分类Dev

为自定义&[u8]类型实现FromStr

来自分类Dev

为Dropwizard资源实现自定义日志记录

来自分类Dev

为动态矩阵类实现自定义迭代器

来自分类Dev

为自定义数据类型实现sum()

来自分类Dev

为Dropwizard资源实现自定义日志记录

来自分类Dev

为动态矩阵类实现自定义迭代器

来自分类Dev

为自定义 std::map 迭代器实现 erase()

来自分类Dev

的AFNetworking 2.0自定义标头

来自分类Dev

Django 3.x-自定义下拉菜单的自定义默认值

来自分类Dev

C3.js自定义X轴

来自分类Dev

cakephp 3.x 创建自定义小部件

来自分类Dev

Java中的自定义缓存实现

来自分类Dev

Java中的自定义缓存实现

来自分类Dev

索引路径长度为3的自定义集合视图布局

来自分类Dev

Bootstrap 3-列内自定义div的高度为100%

来自分类Dev

如何在cakephp3中为无模型表单创建自定义验证

来自分类Dev

如何使用QuickBooks V3 DataService为“发票自定义”字段设置值?

来自分类Dev

如何在蛋糕3中为Flash消息提供自定义的CSS类

来自分类Dev

使用plotly为3D表面图创建自定义轴标签

来自分类Dev

如何在Jekyll 3中为rouge指定自定义语言解析器别名?

来自分类Dev

如何使用QuickBooks V3 DataService为“发票自定义”字段设置值?

来自分类Dev

如何在蛋糕3中为Flash消息提供自定义的CSS类

来自分类Dev

如何在Cast SDK V3中为投射按钮添加自定义样式?

来自分类Dev

为typo3自定义扩展配置全屏后端模块

Related 相关文章

  1. 1

    为融合的kafka-connect-s3实现自定义AvroConverter

  2. 2

    为自定义UICollectionviewCell实现countbyenumeratingwithstate

  3. 3

    具有Ehcache 3.x的Spring Boot 2.x-自定义CacheEventListener中的@Autowired服务为null

  4. 4

    Swift3中的自定义对象的缓存数组

  5. 5

    如何为OkHttp3实现自定义DNS

  6. 6

    为自定义&[u8]类型实现FromStr

  7. 7

    为Dropwizard资源实现自定义日志记录

  8. 8

    为动态矩阵类实现自定义迭代器

  9. 9

    为自定义数据类型实现sum()

  10. 10

    为Dropwizard资源实现自定义日志记录

  11. 11

    为动态矩阵类实现自定义迭代器

  12. 12

    为自定义 std::map 迭代器实现 erase()

  13. 13

    的AFNetworking 2.0自定义标头

  14. 14

    Django 3.x-自定义下拉菜单的自定义默认值

  15. 15

    C3.js自定义X轴

  16. 16

    cakephp 3.x 创建自定义小部件

  17. 17

    Java中的自定义缓存实现

  18. 18

    Java中的自定义缓存实现

  19. 19

    索引路径长度为3的自定义集合视图布局

  20. 20

    Bootstrap 3-列内自定义div的高度为100%

  21. 21

    如何在cakephp3中为无模型表单创建自定义验证

  22. 22

    如何使用QuickBooks V3 DataService为“发票自定义”字段设置值?

  23. 23

    如何在蛋糕3中为Flash消息提供自定义的CSS类

  24. 24

    使用plotly为3D表面图创建自定义轴标签

  25. 25

    如何在Jekyll 3中为rouge指定自定义语言解析器别名?

  26. 26

    如何使用QuickBooks V3 DataService为“发票自定义”字段设置值?

  27. 27

    如何在蛋糕3中为Flash消息提供自定义的CSS类

  28. 28

    如何在Cast SDK V3中为投射按钮添加自定义样式?

  29. 29

    为typo3自定义扩展配置全屏后端模块

热门标签

归档