SCNetworkKit

a simple but powerful iOS、macOS networking framework.

View on GitHub

SCNetworkKit

CI Status Version License Platform

SCNetworkKit 是一个功能强大的网络库,支持 iOS / macOS 平台。在编写该库时参考了 MKNetworkKitAFNetworkingMasonryASIHTTPRequest 等优秀开源项目架构的思想,结合了公司项目的实际情况进行逐步改造演变而来。

SCNetworkKit 演变过程

2016 年我转向 iOS 平台 SDK 相关开发工作,为确保提供出去的 SDK 足够专业,容易集成,防止出现类冲突等报错问题,所以尽量不去依赖主流的开源项目!我造的第一个轮子就是网络请求库,必须能够为 SDK 提供可靠的网络服务,这个库的命名演变过程如下:

SVPNetworkKit -> SLNetworkKit -> SCNetworkKit

目录结构

├── Example
│   ├── Server
│   └── SCNetworkDemo
├── LICENSE
├── README.md
├── SCNetworkKit
│   └── Classes
├── SCNetworkKit.podspec
└── _config.yml

Server 使用方法:

cd Server
//第一次运行需要安装下依赖库,以后执行就不用了
npm install
//启动 server
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,专门用于发送带有 body 体的 POST 请求,body 体内容支持四种编码方式:

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

版本

由于该网络库是完全为自己业务服务的,因此不是所有的功能都很完善,而是用到时再加,发现不合理就改,所以如果你使用了 SCNetworkKit ,发现功能缺失,可以提交 PR 或者 Issue 给我!