iOS AFNetworking 数据缓存(3)

AFNetWorking 在IOS开发中是一个经常会用的第三方开源库,其最好处是维护及时,源码开源。 

常用GET与POST请求方法:

POST请求: 

?


1

2

3

4

5

6

7

8

9

//初始化一个请求对象 

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

  NSString * url = @"你的请求地址";

  //dic 为参数字典

 [manager POST:url parameters:dic success:^(AFHTTPRequestOperation *operation, id responseObject) {

    //请求成功的回调

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    //请求失败的回调    

    }];

GET请求: 

?


1

2

3

4

5

6

7

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

 NSString * url = @"你的请求地址";

   [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

    //请求成功的回调

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    //请求失败的回调   

    }];

这里有一个地方需要注意, 

?


1

[AFHTTPRequestOperationManager manager]

这个类方法我们点进源码可以发现: 

?


1

2

3

+ (instancetype)manager {

    return [[self alloc] initWithBaseURL:nil];

}

这里初始化了一个返回了一个新的对象,并不是单例。 

使用这样的下载方法,下载完成后的数据AFNetWorking会帮我们自动解析,但是有时候服务器给的数据并不标准,这时我们需要加上这个设置: 

manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

这样我们将得到原始的HTTP返回给我们数据。 

我们再来探究一下,下载成功后,回调方法里的参数到底是什么东西 

?


1

success:^(AFHTTPRequestOperation *operation, id responseObject)

其中,第二个参数 responseObject 是下载下来的data数据,可直接进行JSON等解析。 

第一个参数,是个AFHTTPRequestOperation对象,来看源文件

?


1

2

3

4

5

6

7

8

9

@interface AFHTTPRequestOperation : AFURLConnectionOperation

 

@property (readonly, nonatomic, strong) NSHTTPURLResponse *response;

 

@property (nonatomic, strong) AFHTTPResponseSerializer <AFURLResponseSerialization> * responseSerializer;

 

@property (readonly, nonatomic, strong) id responseObject;

 

@end

可以发现,里面有一个成员便是responseObject,同时,AFHTTPRequestOperation是继承于AFURLConnectionOperation,我们在看看AFURLConnectionOperation这个类: 

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

@interface AFURLConnectionOperation : NSOperation <NSURLConnectionDelegate, NSURLConnectionDataDelegate, NSSecureCoding, NSCopying>

 

@property (nonatomic, strong) NSSet *runLoopModes;

 

@property (readonly, nonatomic, strong) NSURLRequest *request;

 

@property (readonly, nonatomic, strong) NSURLResponse *response;

 

@property (readonly, nonatomic, strong) NSError *error;

 

@property (readonly, nonatomic, strong) NSData *responseData;

 

@property (readonly, nonatomic, copy) NSString *responseString;

 

@property (readonly, nonatomic, assign) NSStringEncoding responseStringEncoding;

 

@property (nonatomic, assign) BOOL shouldUseCredentialStorage;

 

@property (nonatomic, strong) NSURLCredential *credential;

 

@property (nonatomic, strong) AFSecurityPolicy *securityPolicy;

 

@property (nonatomic, strong) NSInputStream *inputStream;

 

@property (nonatomic, strong) NSOutputStream *outputStream;

 

@property (nonatomic, strong) dispatch_queue_t completionQueue;

 

@property (nonatomic, strong) dispatch_group_t completionGroup;

 

@property (nonatomic, strong) NSDictionary *userInfo;

 

- (instancetype)initWithRequest:(NSURLRequest *)urlRequest NS_DESIGNATED_INITIALIZER;

 

- (void)pause;

 

- (BOOL)isPaused;

 

- (void)resume;

看到这里,就离AFNETWorking封装的源头很近了,里面的成员非常多,其中包含了大部分我们需要的信息,可以通过点语法取到,其中有输入输出流,错误信息,请求到的Data数据,以及请求到的字符串数据  

?


1

responseString

我们可以通过 

?


1

NSLog ( @"operation: %@" , operation. responseString );

来打印查看请求到的原始信息。 

几点注意: 

1.关于崩溃url为nil 

大多数这样的原因是url中有特殊字符或者中文字符,AFNETWorking并没有做UTF8的转码,需要: 

?


1

url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

2.添加HttpHead字段的方法 

?


1

2

3

4

 //为这个下载任务HTTP头添加@"User-Agent"字段

 [manager.requestSerializer setValue:_scrData forHTTPHeaderField:@"User-Agent"];

 //打印头信息

    NSLog(@"%@",manager.requestSerializer.HTTPRequestHeaders);

在下载请求中,经常会请求一些不长变化的数据,如果每次APP启动都进行请求,会消耗许多资源,并且有时候缓存的处理,可以大大改善用户体验。 

在AFNETWorking中,并没有提供现成的缓存方案,我们可以通过写文件的方式,自行做缓存。 

在下载方法中: 

?


1

2

3

4

5

6

7

[manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

        //写缓存

        NSString *cachePath = @"你的缓存路径";//  /Library/Caches/MyCache

        [data writeToFile:cachePath atomically:YES];

                succsee(data);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    }];

然后在每次下载前,进行如下判断: 

?


1

2

3

4

5

 NSString * cachePath = @"你的缓存路径";

        if ([[NSFileManager defaultManager] fileExistsAtPath:cachePath]) {

            //从本地读缓存文件

            NSData *data = [NSData dataWithContentsOfFile:cachePath];

            }

有时,我们的下载请求可能是用户的动作触发的,比如一个按钮。我们还应该做一个保护机制的处理, 

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

//初始化一个下载请求数组

NSArray * requestArray=[[NSMutableArray alloc]init];

//每次开始下载任务前做如下判断

for (NSString * request in requestArray) {

        if ([url isEqualToString:request]) {

            return;

        }

    }

 [requestArray addObject:url];

 //下载成功或失败后

 [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

        [requestArray removeObject:url]

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        [requestArray removeObject:url]

    }];

至此,一个比较完成AFNETWorking请求使用流程就完成了。 

时间: 2024-09-09 00:00:17

iOS AFNetworking 数据缓存(3)的相关文章

iOS AFNetworking 数据缓存

How Does Caching Work in AFNetworking? : AFImageCache & NSUrlCache Explained FEB 20TH, 2014 If you are an iOS developer using  Mattt Thompson's 'delightful networking framework' AFNetworking (and if you aren't, what are you waiting for?), perhaps you

ios做数据缓存后,显示数据的逻辑是怎样的?

问题描述 ios做数据缓存后,显示数据的逻辑是怎样的? ios做数据缓存后,显示数据的逻辑是怎样的?因为有上拉加载更多,和下拉刷新,求思路 解决方案 iOS数据缓存iOS开发数据缓存玩转iOS开发 - 数据缓存 解决方案二: 1.获取服务器数据后,可以写入本地文件中,需要用到的时候再去读取就可以了: 2.分页的话类似的: 解决方案三: 每次加载页面都可以先从缓存里面读取,读不到再网络获取

iOS中的NSURLCache数据缓存类用法解析_IOS

 在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在IOS设备中加一个缓存的机制.使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求.下面将介绍如何在IOS设备中进行缓存.  内存缓存我们可以使用sdk中的NSURLCache类.NSURLRequest需要一个缓存参数来说明它请求的url何如缓存数据的,我们先看下它的CachePolicy类型.    1.NS

iOS网络编程之六——数据缓存类NSURLCache使用解析

iOS网络编程之六--数据缓存类NSURLCache使用解析 一.引言         在前面博客中,介绍了NSURLRequest请求类的相关使用方法,其中有介绍关于请求返回数据的缓存策略,实际上,iOS中具体缓存操作的管理是由NSURLCache类来实现的.NSURLRequest类介绍的博客地址如下: iOS中NSURLRequest相关使用:http://my.oschina.net/u/2340880/blog/620225. 二.NSURLCache中方法与属性 ? 1 2 3 4

iOS开发网络篇—数据缓存

iOS开发网络篇-数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存. 二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用服务器

iOS - LocalCache 本地数据缓存

1.自定义方式本地数据缓存 1.1 自定义缓存 1 沙盒路径下的 Library/Caches 用来存放缓存文件,保存从网络下载的请求数据,后续仍然需要继续使用的文件,例如网络下载的离线数据,图片,视频文件等.该目录中的文件系统不会自动删除,可以做离线访问.它的存放时间比 tmp 下的长,但是不如 Library 下的其它目录.总的来说 Caches 目录下存放的数据不能是应用程序运行所必需的,但是能提高应用访问性能的.可写入应用支持文件,保存应用程序再次启动需要的信息.iTunes 不会对这个

iOS 数据库离线缓存思路和网络层封装

一直想总结一下关于iOS的离线数据缓存的方面的问题,然后最近也简单的对AFN进行了再次封装,所有想把这两个结合起来写一下.数据展示型的页面做离线缓存可以有更好的用户体验,用户在离线环境下仍然可以获取一些数据,这里的数据缓存首选肯定是SQLite,轻量级,对数据的存储读取相对于其他几种方式有优势,这里对AFN的封装没有涉及太多业务逻辑层面的需求,主要还是对一些方法再次封装方便使用,解除项目对第三方的耦合性,能够简单的快速的更换底层使用的网络请求代码.这篇主要写离线缓存思路,对AFN的封装只做简单的

OS开发网络篇—数据缓存

iOS开发网络篇-数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存.    二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用

mysql-请教一个ios关于数据访问问题

问题描述 请教一个ios关于数据访问问题 asp.net用sql [php 和java用mysql 那ios对应使用什么数据呢? 解决方案 ios现在主流是用 Sqlite,sql语句和其它一样 解决方案二: 用sqlite,你可以试试用FMDB这些封装好的框架. 解决方案三: 向高手请教一个delphi 数据操作的问题!!! 解决方案四: ios 持久化存储一般有以下几种方法: sqllite core date 持久化缓存 前两个是数据库 第三个是文件存储 解决方案五: 系统的:SQLite