SHModelObject 1.1.9

SHModelObject 1.1.9

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新版本2016年6月

Shan Ul Haq 维护。



  • Shan Ul Haq

SHModelObject 是一个基础模型类,使用 Objective-C 运行时将值从 NSDictionary 分配到模型类的实例变量和属性,这是一个在使用返回 JSON 响应的 web 服务时的基本用例。

比如说您有一个 WebService 返回以下响应:

{
    "user_name" : "Shan Ul Haq",
    "user_id" : 34567,
    "user_role" : "Author",
    "user_x_values" : [
        "abcd", 777, "efgh" , true, false
    ]
}

您使用 JSON 库解析此响应并将其转换为 NSDictionary。现在另一个任务是将以下用户模型对象填充。

@interface User : NSObject {
    NSString *_userName;
    NSInteger _userId;
    NSString *userRole;
}

@property(nonatomic, strong) NSArray *userXValues;

@end

为了填充一个用户对象,您需要编写一些初始化器,它将接受一个 NSDictionary 并逐个填充您的模型类的 ivarsproperties。您将需要为项目中的所有模型类都这样做。您将为您的类添加以下内容并实现此方法。

- (User *)initWithDictionary:(NSDictionary *)responseDictionary;

这就是 SHModelObject 发挥作用的地方,它是一个单个类,其主要目的是减少这种工作量并为您完成工作。您所要做的就是用 SHModelObject subclass 您的模型类,因此上述类变成如下所示:

@interface User : SHModelObject {
    NSString *_userName;
    NSInteger _userId;
    NSString *userRole;
}

@property(nonatomic, strong) NSArray *userXValues;

@end

然后就可以了。SHModelObject 有一个基本的初始化器,它将接受 NSDictionary 并为您填充所有 ivarsproperties

用提供的初始化器初始化模型,然后出发。

User *u = [[User alloc] initWithDictionary:responseDictionary];

SHModelObject 如何知道将哪个值分配给哪个实例变量?

SHModelObject 以有效的方式比较 NSDictionary 的键与 ivarproperty 名称。在比较键的名称与 ivars 时,它不将 _- 算入(同样大小写也不重要)。所以

user_nameUSER_NAMEUSERNAMEUserName 将与 _userNameuserNameUserName 匹配

如果您想为特定的 key/value pair 执行自定义逻辑,可以覆盖 - (void)serializeValue:(id)value withKey:(id)key 方法。确保对于您想解析的值调用 [super serializeValue]。

- (void)serializeValue:(id)value withKey:(id)key
{
    if([key isEqualToString:@"numberVALUE"]) {
        _numberValue = value;
    } else {
        [super serializeValue:value withKey:key];
    }
}

解析 .NET JSON 日期到 NSDate 或 NSTimeInterval

您可以使用 kDateConversionOption 将 .NET JSON 日期字符串转换为 NSDateNSTimeInterval 或将其保持为 NSString 并自行解析。您还可以定义 kInputDateFormat 以指定输入日期格式(JSON 格式、.NET 简单格式或 .NET 带时区的格式)。

解析既是SHModelObject的子类的实例变量

您无需做任何事情 :)。 SHModelObject会自动处理它。查看示例代码。

例如,以下JSON

{
    "name" : "Shan Ul Haq",
    "person_id" : 123,
    "image" : {
        "image_id" : 234,
        "image_url" : "http://image_url",
        "orientation" : "portrait"
    }
}

将自动解析成以下对象

@interface Person : SHModelObject

@property(nonatomic, strong) NSString *name;
@property(nonatomic) int personId;
@property(nonatomic, strong) Image *image;

@end

其中Image对象也是SHModelObject

@interface Image : SHModelObject

@property(nonatomic) int imageId;
@property(nonatomic, strong) NSString *imageUrl;
@property(nonatomic, strong) NSString *orientation;

@end

解析既是SHModelObject的子类的对象数组

与解析SHModelObject实例变量类似,数组也可以处理。您需要指定映射,该映射将定义JSON数组由哪种对象类型组成。

例如,如果您有以下JSON

{ 
     "aKey" : "aValue",
     "arrayOfModels" : [
             {
                 "modelId" : 2,
                 "modelName" : "My Model 2",
                 "modelType" : "My Model Type 2"
                 },{
                 "modelId" : 3,
                 "modelName" : "My Model 3",
                 "modelType" : "My Model Type 3"
                 },{
                 "modelId" : 4,
                 "modelName" : "My Model 4",
                 "modelType" : "My Model Type 4"
                 }
             ]
     }
}

它翻译成以下对象。

@interface MyObject : SHModelObject

@property(nonatomic, strong) NSString *aKey;
@property(nonatomic, strong) NSArray *arrayOfModels;

@end

@interface AModel : SHModelObject

@property(nonatomic) int modelId;
@property(nonatomic, strong) NSString *modelName;
@property(nonatomic, strong) NSString *modelType;

@end

您可以这样转换json

// key is the variable name and value is the class name.
NSDictionary *mappingDictionary = @{@"arrayOfModels" : "AModel"}; 

MyObject *myObject = [MyObject objectWithDictionary:dictionary mapping:mappingDictionary];

SHRealmObject

Realm原生支持。SHRealmObject是来自Realm的RLMObject的子类。如果您想同时使用SHModelObject解析您的JSON响应并使用RLMObject与Realm数据库一起使用,SHRealmObject正是您需要的类。

SHRealmObject的功能与SHModelObject相同,但也符合RLMObject的约束。(例如,您不能使用NSDictionary对象。您将使用RLMArray对象而不是使用NSArrays。)

RLMArray对象也将根据提供的映射字典自动解析。(请参阅上面的解析数组部分)

以下是一个简单的示例。

@interface Person : SHRealmObject

@property NSString *name;
@property int age;
@property RLMArray<Car> *cars;

@end

@implementation Person
@end

////

@interface Car : SHRealmObject
@property NSString *model;
@end

@implementation Car
@end

然后将对象添加到Realm数据库。

RLMRealm *realm = [RLMRealm defaultRealm];
    [realm transactionWithBlock:^{
        NSDictionary *d = @{
            @"nAme" : @"Shan Ul Haq",
            @"_AGE" : @26,
            @"cars" : @[ @{@"moDEL" : @"Honda"}, @{@"model" : @"Toyota"} ]
        };
        Person *p = [Person objectWithDictionary:d mappings:@{ @"cars" : @"Car" }];
        [realm addObject:p];
    }];

如何使用。

1- 添加文件

使用CocoaPods

  • 如果只想使用SHModelObject,请在Podfile中添加 pod 'SHModelObject/Core'
  • 如果要将SHRealmObject与Realm一起使用,请在Podfile中添加 pod 'SHModelObject/Realm'
  • 如果您想同时使用SHModelObjectSHRealmObject,请在Podfile中添加 pod 'SHModelObject'

手动

  • 只需将类添加到您的项目中。

2- 使用SHModelObjectSHRealmObject将您的模型子类化

3- 使用提供的初始化器并传递响应的NSDictionary(initWithDictionary:和其他变体)进行初始化

4- 如果您想以自己的方式解析特定的键值,请覆盖serializeValue

5- 就这么简单。出发吧。

待办事项

  • [X] 添加到CocoaPods
  • [X] 添加对自定义实例变量类型的支持,这些类型也是SHModelObject的子类
  • [X] 为模型对象实现NSCoding以进行存档/解档。
  • [X] 添加对自定义SHModelObject对象数组的支持。
  • [ ] 实现将对象转换为NSDictionary的反序列化器。

联系我

Shan Ul Haq (http://g革命.com)

许可证

SHModelObject根据MIT许可证提供。有关更多信息,请参阅LICENSE文件。