WBNetwork 0.1.2

WBNetwork 0.1.2

AllenSWB 维护。



WBNetwork 0.1.2

  • AllenSWB

WBNetwork

iOS 网络请求库、基于 AFN3、链式调用

### 一款基于 AFN3.0 封装链式风格的网络请求库

#### 特性

  1. 使用 AFNetworking 进行网络请求
  2. block 回调方式
  3. 集约式的请求方法,链式调用
  4. 在快速请求同一个 API 时,可以通过设置 minRequestInterval 防止这种情况发生。如果两次请求时间间隔小于 minRequestInterval,则直接从缓存文件中获取数据。(如果对数据即时性要求较高,设置 minRequestInterval 为 0 关闭此功能)
  5. 可以同时发起多个请求,在全部请求完成后有一个 block 回调,传回来一个 Dictionary。字典 key 是请求的链接,value 是成功返回的数据 data 或错误 error。
  6. 可以设置请求的默认参数。
  7. 两个 baseURL,一个测试环境,一个正式环境。
  8. 简单数据处理:可以选择交付给业务层的三种数据类型: NSDictionary (默认)、NSString、NSData。
  9. 定义了一个插件机制。例如:加入 HUD 插件

#### 使用示例

    /**
     * 1. 在合适的地方设置默认参数, 例如AppDelegate中didFinishLaunch方法
     */
     //设置好baseUrl,发起请求的时候就可以写部分URL。例如:url(@"/user/login")
    WBREQUEST.baseUrlDebug = @"http://www.debug.com";//测试环境baseURL
    WBREQUEST.baseUrlRelease = @"http://www.release.com";//正式环境baseURL
    //默认请求参数,发起请求的时候可以不调用parameters方法,或者传入除了默认参数之外的其他参数。
    WBREQUEST.defaultParameters = @{@"appid":@"",@"appPass":@""};//访问服务器的账号和密码。
    //是否使用缓存,默认YES
    WBREQUEST.cacheData = NO;
    //发起同一请求最小时间间隔,默认1s
    WBREQUEST.minRequestInterval = 2;

    //添加HUD插件
    [WBREQUEST wb_addPlugIn:[WBReqeustHUDPlugIn new]];

    
    /**
     * 2. 发起一个请求. 最简单可以调用url success startRequest三个方法就可以发起一个请求.
     */
    WBReqeustHUDPlugIn *plugIn = (WBReqeustHUDPlugIn *)[WBREQUEST plugInWithIdentifier:@"hud"];//hud插件
    plugIn.HudInView = self.view;//可以选择将hud加在self.view上而非window上
    plugIn.HudText = @"正在登录...";

    //网络请求
    WBREQUEST.url(@"/user/login").parameters(@{@"phone":@"136********",@"passwd":@""}).success(^(NSURLSessionDataTask *task, id responsedObj){
        WBLog(@"登录成功");
    }).failure(^(NSURLSessionDataTask *task, NSError *error){
        WBLog(@"登录失败");
    }).startRequest();

    /**
     * 3. 同时发起多个请求
     */
    WBReqeustHUDPlugIn *plugIn = (WBReqeustHUDPlugIn *)[WBREQUEST plugInWithIdentifier:@"hud"];
    plugIn.isPlugInFree = YES; // 让插件失效

    WBREQUEST.batchRequestTypes(@[WBPOST,WBPOST,WBPOST]).batchUrls(@[url0,url1,url2]).batchParameters(@[@{},@{},@{}]).batchRequestDone(^(NSDictionary *dic) {
    
    	//记得请求完成奖插件恢复能用
        plugIn.isPlugInFree = NO;

        WBLog(@"======================\ndic is %@\n================================",dic);
        
        for (id obj in dic.allValues) {
            if ([obj isKindOfClass:[NSError class]]) {
                WBLog(@"obj 出现了\n有错!");
            } else {
                WBLog(@"obj 出现了\n数据:%@",obj);
            }
        }
        
    }).startBatchRequest();

#### 编码过程中的思考

  1. 网络请求可以使用 NSURLSession 或 AFNetworking。为了方便起见,这里使用了 AFNetworking
  2. 回调方式可以使用 delegate 或 block。为了使用方便,这里使用了 block。// 回调时,将一个 block 作为参数,因此这里不能自动生成格式,需要手动编写。在代码中使用时可以拖到代码块以提高效率,就像 dispatch_once 一样写成代码块 success(^(NSURLSessionDataTask *task, id responsedObj){ WBLog(@"登录成功"); })
  3. 请求方式可以使用集约式或离散式。同样是为了方便起见,这里选择了集约式请求方式。YTKNetwork 使用离散式请求方式,适用于大型项目。
  4. 为了方便起见,这里使用链式调用。可以设置 baseUrl、默认参数等。至少可以使用三个方法发起一个请求:url、success、startRequest。
  5. 为了防止快速连续的请求同一个接口,可以设置 minRequestInterval,默认值为 1 秒。也就是说,在一秒内向同一个接口发起两次请求,第二次并不会真正发起请求,而是从缓存中获取数据。判断时间间隔实用的是缓存文件的“最后修改时间”。
  6. 同时发起多个请求时,因为 WBRequest 是单例,可能会出现回调错乱的情况。为了解决这个问题,加了一个 recorder 数组。每个请求对应一个 recorder,recorder 持有 success 回调、failure 回调,这样回调就不会找错了。
  7. 在 A 页面发起一个请求,成功回调中使用了 self,请求未完成时用户就点了返回键。这时候 A 并不会 delloc,而是等待接口请求成功/失败后,回调方法完成后才 delloc。这个功能的实现是每次发起一个请求时,都会创建一个 recorder 去持有 url、parameters、success 回调、failure 回调等。请求完成后会将这个 recorder 置 nil。
  8. 在发起每个请求之前,检查网络状态,无网络时直接提示用户。
  9. 简单的格式处理,可以直接返回给业务层三种数据类型:NSData、NSDictionary、NSString。
  10. 缓存使用归档,每个请求的数据写成一个文件。

#### Github 地址

WBNetwork

#### 简书地址

悟空没空

#### 送上一个代码块 ^^

 WBREQUEST.url(<#NSString * url#>).parameters(<#NSDictionary * parameters#>).success(^(NSURLSessionDataTask * task,id responseObject){
 <#code#>
}).startRequest();