SCNetworkKit

a simple but powerful iOS networking framework.

View on GitHub

SCNetworkKit

SCNetworkKit 是一个基于 MKNetworkKitAFNetworking 的 iOS 网络库,结合自身项目需要,并且融合了自己的一些最佳实践。

SCNetworkKit 演变过程

有段时间我专业从事 SDK 的开发工作,要确保提供出去的 SDK 容易集成,防止由于类冲突导致的报错问题,所以要尽量避免依赖开源库!我需要一个稳定的网络请求框架,能够为 SDK 提供可靠的网络服务,因此有了如下演变过程:

SVPNetworkKit -> SLNetworkKit -> SCNetworkKit

目录结构

├── LICENSE
├── README.md
├── SCNDemo
├── SCNetworkKit
├── SCNetworkKit.podspec
├── Server
└── _config.yml

Server 使用方法:

cd Server
//第一次运行需要安装下依赖库,以后执行就不用了
npm install
npm start

安装方式

使用范例

假设服务器返回的数据格式如下:

{ 
  code = 0;
  content =     {
     entrance =         (
         {
	         isFlagship = 0;
	         name = "\U65f6\U5c1a\U6f6e\U65f6\U5c1a";
	         pic = "http://pic12.shangpin.com/e/s/15/03/03/20150303151320537363-10-10.jpg";
	         refContent = "http://m.shangpin.com/meet/185";
	         type = 5;
         },
         {
            //....
         }
       )
     }
 }

下面演示如何通过配置不同的解析器,从而达到着陆 block 回调不同结果的效果:

由于上面有 JSON 转 Model 的过程,因此在使用之前需要注册一个对应的解析器,你可以到 demo 里搜下 [SCNModelResponseParser registerModelParser:[SCNModelParser class]]; 具体看下究竟。

链式编程

SCNJSONResponseParser *responseParser = [SCNJSONResponseParser parser];
///框架会检查接口返回的 code 是不是 0 ,如果不是 0 ,那么返回给你一个err,并且result是 nil;
responseParser.checkKeyPath = @"code";
responseParser.okValue = @"0";
    
///support chain
    
SCNetworkRequest *req = [[SCNetworkRequest alloc]init];
    
req.c_URL(@"http://debugly.cn/dist/json/test.json")
   .c_ResponseParser(responseParser);
   .c_CompletionHandler(^(SCNetworkRequest *request, id result, NSError *err) {
        
            if (completion) {
                completion(result);
            }
       });
[[SCNetworkService sharedService]sendRequest:req];

架构设计

设计图:

采用注册的方式解耦和

功能强大的同时要顾及到扩展性,本框架支持很多扩展,以响应解析为例,你可以继续创建你想要的解析器;可以使用你喜欢的 JOSN 转 Model 框架来做解析;可以让网络库解析更多格式的图片;这些都是可以做到的,并且还很简单。

我在 demo 里面使用的是我的另外一个轮子:SCJSONUtil ;具体实现可查看demo。

这种注册器的方式优雅地扩充了网络库的功能,就好比插件一样,插上就能用,只需要规格上符合我协议里规定的要求即可!反之,如果你不需要解析 webp, 你不需要 json 转 model 的话,你就没必要去插对应的模块!

如果没有注册器这么一个好的实践的话,要达到同样的扩展效果可能就很难了!如果你有别的点子请联系我。

SCNetworkService

由上图可知,SCNetworkService 主要起到了发起网络请求,处理好 Request,task,delegate 对象的一一对应关系的作用!

SCNetworkRequest

NSURLSession 管理的网络请求结束后,会在 SCNetworkRequest 里处理响应数据,根据配置的 ResponseParser 去异步解析,最终在主线程里安全着陆;

SCNetworkPostRequest

继承了 SCNetworkRequest,专门用于发送 POST 请求,支持四种编码方式:

只有使用 SCNKParameterEncodingFormData 方式的请求采用 HTTPBodyStream !

版本

如有问题,或者需要 SCNetworkKit 提供更强大的功能,请提 issue 给我,3q!