基于ASI封装的数据请求工具类 DataBoss说明文档

#DataBoss DataBoss是基于ASIHTTPRequset的二次封装,目的是用更少的代码完成更多的功能,简约是美。 ##功能简介 DataBoss是由实际项目发展而来,最初是为了解决项目中的种种需求而设计,所以功能本身是具有局限性,不能满足所有的需求,因此希望更多的人参与进来不断完善它!它的功能主要分为两类:一是数据请求工具,二是UITableView工具,具体如下:

  • 数据请求工具
    • 数据请求(包括POST和GET方式)
    • 请求并缓存图片
    • 上传数据(POST方式)
  • UITableView工具
    • 列表信息请求
    • 分页查询
    • 刷新

数据请求部分主要用的是block方式实现,在block中实现自己的业务代码;UITableView工具主要用代理(deletage)实现。它们都需要请求队列(ASINetworkQueue)并作为参数手动传入方法,这样就可以在请求的过程随时打断请求,以免在某些情况下造成程序的Crash。 ##方法(API)介绍 ###数据请求工具

  • 请求数据

      /**
        *  发起异步请求,回调函数中返回NSDictionary
        *
        *  @param url     请求链接
        *  @param queue   管理请求的队列,详情查看 |ASINetworkQueue|
        *  @param handler 异步请求的回调
        */
       + (void) sendAsynchronousRequest:(NSString *)url
                                  queue:(ASINetworkQueue*)queue
                      completionHandler:(void (^)(ASIHTTPRequest *request, NSDictionary *json, NSString *errorMsg))handler;
    

如果请求中出现错误,会返回给errorMsg,错误包含网络无连接和非200状态的请求结果,此处不涉及到断点续传等情况,所以没有考虑20x状态。默认的缓存策略是ASIAskServerIfModifiedWhenStaleCachePolicy,如果需要指定缓存策略可以用下面这个方法。

	/**
	  *  发起异步请求,回调函数中返回NSData
	  *
	  *  @param url         请求链接
	  *  @param cachePolicy 缓存策略,查看 |ASICachePolicy|
	  *  @param queue       管理请求的队列,详情查看 |ASINetworkQueue|
	  *  @param handler     异步请求的回调
	  */
	 + (void)sendAsynchronousRequest:(NSString *)url
	                     cachePolicy:(ASICachePolicy)cachePolicy
	                           queue:(ASINetworkQueue *)queue
	       completionHandlerWithData:(void (^)(ASIHTTPRequest *request, NSData *data, NSString *errorMsg))handler;
	 
	 /**
	  *  发起异步请求,回调函数中返回NSDictionary
	  *
	  *  @param url         请求链接
	  *  @param cachePolicy 缓存策略,查看 |ASICachePolicy|
	  *  @param queue       管理请求的队列,详情查看 |ASINetworkQueue|
	  *  @param handler     异步请求的回调
	  */
	 + (void)sendAsynchronousRequest:(NSString *)url
	                     cachePolicy:(ASICachePolicy)cachePolicy
	                           queue:(ASINetworkQueue *)queue
 	 completionHandlerWithDictionary:(void (^)(ASIHTTPRequest *requset, NSDictionary *json, NSString *errorMsg))handler;

以上两个方法可以指定缓存策略,唯一不同点是返回的结果数据类型不一样,一个是把返回结果序列化成了NSDictionary类型,另一个是NSData类型,根据自己的需求选择合适的方法。

  • 图片(文件)请求

      /**
        *  请求并且缓存图片,回调函数返回UIImage对象
        *
        *  @param picturePath 图片路径
        *  @param _queue      请求队列,记得在dealloc的时候取消queue里面的请求
        *  @param handler     回调函数
        */
       + (void)requsetAndCacheImage:(NSString *)picturePath
                              queue:(ASINetworkQueue *)queue
                         completion:(void(^)(ASIHTTPRequest *request , UIImage *image , NSString *errorMsg))handler;
    

传入图片的网络路径(picturePath),返回UIImage对象。有人会问,如果要请求其它文件该如何办,DataBoss提供一个更通用的方法来请求和缓存文件:

	/**
	  *  请求并且缓存文件,返回缓存路径,通过缓存路径取得文件
	  *
	  *  @param fileURL 文件路径
	  *  @param queue   请求队列
	  *  @param handler 回调函数
	  */
	 + (void)requestAndCacheFile:(NSString *)fileURL
	                       queue:(ASINetworkQueue *)queue
	                  completion:(void(^)(ASIHTTPRequest *request, NSString* cachedPath, NSString* errorMsg))handler;

同上面一样,传入文件请求路径,返回的是本地的缓存路径,可以通过路径取得文件,之后对文件进行何种操作都可以。 对于图片请求,还会有延时请求的需求,即先把所有的图片请求加入队列但此时不请求,等一声令下,才开始请求,当然不是全部都请求,根据queue配置同时最大请求数量而定,方法如下:

	/**
	  *  延时请求并且缓存,回调函数返回UIImage,调用[queue go]开始请求图片
	  *
	  *  @param picturePath 图片路径
	  *  @param queue       请求队列,记得在dealloc的时候取消queue里面的请求
	  *  @param handler     回调函数
	  */
	 + (void)requsetAndCacheImageLazy:(NSString *)picturePath
	                            queue:(ASINetworkQueue *)queue
	                       completion:(void(^)(ASIHTTPRequest *request , UIImage *image , NSString *errorMsg))handler;
  • 上传文件 此部分参数略微复杂(第一印象),不过理解参数之后就会很清晰了,先看方法:

      /**
        *  上传文件到服务器,可以携带其他参数
        *
        *  @param data      文件的NSData
        *  @param server    上传链接
        *  @param key       服务器接受文件的key
        *  @param type      文件类型,kDataBossFileTypeJPEG,kDataBossFileTypePNG,kDataBossFileTypeMP4
        *  @param queue     上传队列
        *  @param params    其他参数
        *  @param handler   上传成功的回调block
        */
       + (void)uploadFile:(NSData *)data
                 toServer:(NSString *)server
                  withKey:(NSString *)key
              contentType:(NSString *)type
                    queue:(ASINetworkQueue *)queue
             andParams:(NSArray *)params
                 complete:(void(^)(ASIFormDataRequest *request,NSDictionary *json,NSString *errorMsg))handler;
    

需要说明的是params参数,它是包含其他需要上传参数的集合,参数的形式是以键值对方式组织的,params可能是下面的值:

	NSArray *params = @[
	      @{@"key":@"username",@"value":@"guest"},
	      @{@"key":@"sex",@"value":@1}
	];

返回结果是已经序列话成的NSDictionary对象。这样分解一下,是不是感觉好多了,总结一下,参数包含文件,服务器接收文件的key,文件类型、其它的参数和服务器地址,如果文件类型不满足请自行添加,并在gitpull给我。 主要功能就是这些,如果需要详细了解,可以结合代码理解。下面看看如何使用它们。 ###UITableView工具 数据请求工具部分上面已经介绍完了,接着介绍如何使用DataBoss配合UITableView使用,满足普遍需求。 此部分主要有以下几个方法:

	 - (id)initWithAction:(NSString *)action;
	 - (void)fetchObjectsInBackground;
	 - (void)refresh;
	 - (void)nextPage;
	 - (void)cancel;

正如方法名表达的一样,nextPage是请求下一页数据,refresh刷新数据,即请求第一页数据,fetchObjectsInBackground异步请求数据,cancle取消请求。 下面通过假设场景来说明,假设有个UITableView需要展示酒店信息(Hotel对象),只需定义一个HotelFetcher继承自DataBoss,在HotelFetcher.m文件里面重写父类的- assemble:data authorization:flag errorMsg:error方法,此方法的返回值是一个数据,里面包含的是Hotel对象,可能的代码片段如下:

	- (NSArray *)assemble:(NSData *)data authorization:(BOOL *)flag error:(NSError *__autoreleasing *)error
	 {
	     NSMutableArray *datas = [[NSMutableArray alloc] init];
	     __autoreleasing NSError *err;
	     NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&err];
	     if (err!=nil) {
	 	   //JSON格式错误
	         error = &err;
	         return nil;
	     }
	     
	     //如果JSON对象不为空,并且没有错误信息
	     if(json != nil && err == nil){
	         
	         //解析NSDictionary,组装成Hotel对象
	         //把Hotel对象加入datas中
	                 
	      }else{
	 
	                 __autoreleasing NSError *customError = [NSError errorWithDomain:@"com.yourcompany.projectname" code:1 userInfo:@{@"NSLocalizedDescription":[json objectForKey:@"result"]}];//result里面包含错误信息
	                 error = &customError;
	             }
	         }
	     }
	     return datas;
	 }

接下来初始化一个HotelFetcher对象dataFetcher,注意需要分页查询时要设置一下参数:

	[dataFetcher setAction:@""];//设置请求Action,不要包含limit和page,会自动设置
	dataFetcher.limit = 10; //分页条数,默认10条
	dataFetcher.timeout = 10; //请求超时秒数,默认10秒
	dataFetcher.enablePaging = YES;  //是否支持分页,默认NO
	dataFetcher.delegate = self; //请求回数据的代理
	出异步请求后,接受数据的代理方法是
	- (void)fetcher:(DataBoss *)fetcher fetchResult:(NSArray *)objects error:(NSString *)errorMsg authorization:(BOOL)authorization 		sMore:(BOOL)hasMore
	 {
	     if(errorMsg){
	         [self showTips:errorMsg];//显示错误信息
	     }else{
	         
	         _hasMore = hasMore;//是否还有下一页,
	         
	         [datas addObjectsFromArray:objects];
	         [self.tableView reloadData];
	     }
	 }

整个流程介绍完毕,总的来说需要做的有两件事情

  • 第一,如何把请求回来的数据封装成想要的对象,比如系统里可能有Model1Model2,这个请求的结果到底返回哪类对象的数组,需要自己去实现,也就是- assemble:data authorization:flag errorMsg:error
  • 第二,数据返回来(同一个代理方法返回的),需要做何种处理,具体业务逻辑需要自己判断,比如有可能是刷新,也有可能是下一页操作,即- (void)fetcher:(DataBoss *)fetcher fetchResult:(NSArray *)objects error:(NSString *)errorMsg authorization:(BOOL)authorization hasMore:(BOOL)hasMore

使用DataBoss后,不用写很多重复的请求代码就能很轻松的实现分页,请求等功能。 ##实战 初始化ASINetworkQueue对象是通用代码,在此单独写出来,以下案例中的queue不再一一初始化:

	ASINetworkQueue *queue= [[ASINetworkQueue alloc] init];
	 //可以配置其他属性,比如最大连接数等
	#场景一
	起一个检测更新的请求:
	NSString *url = @""; //检测地址
	     [DataBoss sendAsynchronousRequest:url cachePolicy:ASIAskServerIfModifiedCachePolicy queue:queue 		mpletionHandlerWithDictionary:^(ASIHTTPRequest *requset, NSDictionary *json, NSString *errorMsg) {
	         if (!errorMsg) {
	             //没有请求错误,解析json内容来判断是否有更新
	             //可以NSLog(@"%@",json);查看返回的内容
	         }else{
	             //请求出现错误,可以在errorMsg中查看
	         }
	     }];

###场景二:请求图片

	NSString *urlStr = @"";//图片的地址
	     [DataBoss requsetAndCacheImage:urlStr queue:queue completion:^(ASIHTTPRequest *request, UIImage *image, NSString *errorMsg) {
	         if (!errorMsg) {
	 		//没有问题,可以用image对象
	         }else{
	 		//请求错误,处理错误
	     }];

如果再次请求该图片,将使用缓存的图片。

###场景三:上传文件

	NSString *urlStr = @"";//接收数据的链接
	 NSArray *params = @[
	                             @{@"key":@"key1",@"value":value1==nil?@"":value1},
	                             @{@"key":@"key2",@"value":value2==nil?@"":value2}
	  ];
	  [DataBoss uploadFile:fileData toServer:urlStr withKey:@"uploadFile" contentType:kDataBossFileTypeJPEG queue:queue andParams:params 		mplete:^(ASIFormDataRequest *request, NSDictionary *json, NSString *errorMsg) {
	             if (!errorMsg) {
	                 //上传成功,处理返回结果
	             }else{
	                 //上传失败
	             }
	         }];

##注意事项

  • 发送请求时不要把链接编码成UTF8格式,DataBoss在发送请求时会自动加上编码,否则链接含有中文时得到的结果和预期不一样。
  • 配合UITableView分页查询时,服务器接受的分页参数是pagelimit
  • 常用的代码块(code snippet)
    • 处理返回结果

         if (!errorMsg) {
           //上传成功,处理返回结果
         }else{
           //上传失败
         }
      
    • dealloc方法中取消请求

        for (ASIHTTPRequest *req in queue.operations) {
             [req clearDelegatesAndCancel];
         }
      

转载于:https://my.oschina.net/juwenz/blog/389295

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值