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 并逐个填充您的模型类的 ivars
和 properties
。您将需要为项目中的所有模型类都这样做。您将为您的类添加以下内容并实现此方法。
- (User *)initWithDictionary:(NSDictionary *)responseDictionary;
这就是 SHModelObject
发挥作用的地方,它是一个单个类,其主要目的是减少这种工作量并为您完成工作。您所要做的就是用 SHModelObject
subclass
您的模型类,因此上述类变成如下所示:
@interface User : SHModelObject {
NSString *_userName;
NSInteger _userId;
NSString *userRole;
}
@property(nonatomic, strong) NSArray *userXValues;
@end
然后就可以了。SHModelObject
有一个基本的初始化器,它将接受 NSDictionary 并为您填充所有 ivars
和 properties
。
用提供的初始化器初始化模型,然后出发。
User *u = [[User alloc] initWithDictionary:responseDictionary];
SHModelObject
如何知道将哪个值分配给哪个实例变量?SHModelObject
以有效的方式比较 NSDictionary
的键与 ivar
或 property
名称。在比较键的名称与 ivars 时,它不将 _
、-
或 算入(同样大小写也不重要)。所以
user_name
或 USER_NAME
或 USERNAME
或 UserName
将与 _userName
或 userName
或 UserName
匹配
如果您想为特定的 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];
}
}
您可以使用 kDateConversionOption
将 .NET JSON 日期字符串转换为 NSDate
或 NSTimeInterval
或将其保持为 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];
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'
SHModelObject
和SHRealmObject
,请在Podfile中添加 pod 'SHModelObject'
手动
2- 使用SHModelObject
或SHRealmObject
将您的模型子类化
3- 使用提供的初始化器并传递响应的NSDictionary(initWithDictionary:和其他变体)进行初始化
4- 如果您想以自己的方式解析特定的键值,请覆盖serializeValue
5- 就这么简单。出发吧。
SHModelObject
的子类NSCoding
以进行存档/解档。SHModelObject
对象数组的支持。Shan Ul Haq (http://g革命.com)
SHModelObject
根据MIT许可证提供。有关更多信息,请参阅LICENSE文件。