iOS端JSON转Model链式编程框架SuperKVC使用方法与原理

背景

在client编程中。字典转模型是一个极为常见的问题,苹果提供了KVC来实现NSDictionary到Model的注入,可是KVC仅仅能进行单层浅注入。且无法处理类型转换、key与属性名不正确应、深度注入等问题,笔者从Masonry得到启示,开发了一个通过链式配置注入器实现深度注入、类型转换、key-属性名映射等功能的轻量级注入框架SuperKVC。眼下已经开源到GitHub,点击这里前往。欢迎Star和Fork。欢迎和我一起完好这个框架!

本文将从应用和原理两个角度介绍SuperKVC

使用方法

该框架与Masonry相似,要求用户在相关方法參数的block中通过链式编程的方法配置注入器參数,比如配置要创建和注入的class、类型转换器、名称映射等,然后方法会返回注入后的结果。假设JSON的根元素为字典,则返回一个模型实例。假设JSON的根元素为数组,则返回一个模型数组。

浅注入演示样例

假设我们有例如以下的JSON。要注入到UserModel中。

{
    "id": 100075,
    "name": "Greedy",
    "birthday": "1993-03-06",
    "isVip": true,
    "partners": [100236, 100244, 100083]
}
@interface UserModel : NSObject

@property (nonatomic, assign) int64_t userId;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSDate *birthday;
@property (nonatomic, assign) BOOL isVip;
@property (nonatomic, strong) NSArray *partners;

@end

注意到这里的几个“坑点”,响应的id相应的是模型的userId。响应的birthday类型为NSString,而模型的birthday类型为NSDate。使用SuperKVC进行注入的代码例如以下。

// responseObject is a JSONObject(NSDictionary).
UserModel *userModel = [responseObject sk_injectWithInjector:^(SuperKVCInjector *injector) {
// 配置要生成和注入的模型实例类型
injector.bind([UserModel class]);
// 配置key到属性名的映射
injector.mapping(@"id").to(@"userId");
// 配置类型转换
injector.format(@"birthday").with.converter(^NSDate* (NSString *birthdayString) {

iOS端JSON转Model链式编程框架SuperKVC使用方法与原理

时间: 2024-10-17 01:53:48

iOS端JSON转Model链式编程框架SuperKVC使用方法与原理的相关文章

iOS开发技巧系列---使用链式编程和Block来实现UIAlertView

UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本文也并不提倡开发者再使用UIAlertView,本文的目的是探讨如何将原来的给变量赋值和通过Delete来回调的方式变成链式编程风格和通过Block来回调.通过学习对UIAlertView的改造让各位iOS开发者能够学会这种更加便捷的开发方式 什么是链式编程 对于有一定开发经验的开发者来说,链式编程

iOS:用Block写一个链式编程

一.介绍 链式编程是一个比较新颖的编程方式,简单直观,用起来也比较舒服.目前比较有名的Mansory和BabyBlueTooth就是使用链式编程写的第三方框架. 二.写法 链式编程写法不同于传统方式,初次写起来比较别扭,但是一旦习惯了,用起来比较得心应手.那么,如何写呢?其实就是一个对象调用它的实例方法后返回一个block(已经定义过),而这个block内部又返回该对象.依此类推,该对象不论调用多少个它的实例方法,最终都会返回该对象本身. 三.实例 LearnManager类定义和实现 // /

iOS 利用Block实现链式编程

1. 传统编程 // Person的方法 - (void)eat { NSLog(@"吃饭"); } - (void)learn { NSLog(@"学习"); } - (void)play { NSLog(@"娱乐"); } // 连续做事情 Person *p = [ [Person alloc] init ]; [p eat]; [p learn]; [p play]; 2. 不用Block,实现链式编程 // Person的方法 - (P

JavaScript系列:模块化与链式编程

模块化:闭包和和函数作用域(JS没有块级作用域ES6之前)构造模块 1 var man=function(){ 2 var age=12; 3 return { 4 getYear:function(){ 5 return age; 6 }, 7 setYear:function(n){ 8 age=n; 9 } 10 } 11 } 12 13 var peter=man(); 14 document.write(peter.getYear()); //12 15 peter.setYear(2

链式编程

1 package com.nd.pdca.model; 2 3 public class Manager { 4 5 private String id; 6 private String userId; 7 private String userNo; 8 private String userName; 9 private String unitId; 10 11 public String getUserNo() { 12 return userNo; 13 } 14 15 public

MVVM模式下如何使用ReactiveCocoa响应链式编程<一>

前一阵子公司要求项目从新架构,但又只给不到一个月的时间,这显然是不可能的.但从新架构又是在所难免的,和同事商定后决定一部分交互逻辑比较少的界面先使用MVVM架构,然后慢慢修改.下面整理了一下这次重构的遇到的问题,并希望能给大家一些帮助. 1.ReactiveCocoa的使用 要使用MVVM模式编程收下选择一个框架,当然不仅仅是ReactiveCocoa这一个框架,这里就不多说.当然我也没用过别的,如果哪位看官用过可以多多指教.接下来我就按步骤说了: 第一步:导入ReactiveCocoa框架,建

数往知来 JQuery_选择器_隐式迭代_链式编程 <二十>

一.通过js实现页面加载完毕执行代码的方式与jquery的区别 1.通过jquery的方式可以 让多个方法被执行,而通过window.onload的方式只能执行最后一个, 因为最后一次注册的方法会把前面的方法覆盖掉 1. window.onload需要等待页面的所有元素资源比如说img里的图片一些连接等等都下载完毕后才会触发: 2. 而jquery只要页面的标签元素都下载完毕就会触发了 二.$.map(数组,function(ele,index){})函数对数组进行遍历,遍历之后会返回一个新的数

(一一八)利用block实现链式编程

有些时候需要不断地调用方法,如果使用传统方案,需要拿到对象多次调用,例如有一个Ball对象,实现了up.down.left.right四个方法,分别控制球的运动方向,如果要实现球向右再向下,需要这么写: [ball right]; [ball down]; 如果能够按照下面这样写,会更加方便. [[ball right] down]; 要实现这样的功能十分简单,只要每个方法都返回self即可,但是如果调用次数多,会有很多个中括号.如果能改造成后面这样,会更好. ball.right().down

ASP.NET MVC学前篇之扩展方法、链式编程

前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的是外围的知识,有的是包含在框架内的. MVC学前篇字样?有噱头的成分也有真实的成分,所以工欲善其事,必先利其器.器是什么?基础嘛,虽然说MVC框架中涉及到的知识很多很多也不是我一篇两篇能说完的,我能做的就是知道多少就跟大家分享多少,当然了随着时间的推移会完善这个系列. 1扩展方法 扩展方法是C# 3.0特性里的知识,它用在最多的地方是在Linq中,