Realm是由美國(guó)YCombinator
孵化的創(chuàng)業(yè)團(tuán)隊(duì)歷時(shí)幾年打造任斋,第一個(gè)專門針對(duì)移動(dòng)平臺(tái)設(shè)計(jì)的數(shù)據(jù)庫(kù)猿涨。Objective?C
版本的Realm
能夠讓您以一種安全、耐用以及迅捷的方式來(lái)高效地編寫應(yīng)用的數(shù)據(jù)模型層览效。
最近使用過程中遇到問題罪佳,就是RLMObject
的解析與Copy
逛漫,正常處理無(wú)法完成。
問題
其實(shí)兩個(gè)問題最終歸為一個(gè)問題就是使用Realm
項(xiàng)目中繼承RLMObject
的對(duì)象赘艳,在獲取類名發(fā)現(xiàn)我們無(wú)法獲取到對(duì)應(yīng)的類名酌毡。
解決辦法
#import <Foundation/Foundation.h>
#import "MJExtension.h"
#import <Realm.h>
NS_ASSUME_NONNULL_BEGIN
@interface SRDishTypeModel : RLMObject
@property (nonatomic, copy) NSString * name;
@property (nonatomic, assign) NSInteger id;
@end
NS_ASSUME_NONNULL_END
正常情況下我們獲取對(duì)象的類名,一般是這樣的[object class]
SRDishTypeModel *model = [[SRDishTypeModel alloc]init];
model.name = @"張三";
model.id = 5;
NSLog(@"%@",[model class]);
結(jié)果1
結(jié)果
這樣就導(dǎo)致我們無(wú)法取到類名蕾管,那么就無(wú)法完成后續(xù)操作了枷踏。
RLMObject
提供了一個(gè)方法給我們?nèi)カ@取這個(gè)對(duì)象的類名;
+ (NSString *)className;
接下來(lái)我們重新
SRDishTypeModel *model = [[SRDishTypeModel alloc]init];
model.name = @"張三";
model.id = 5;
NSLog(@"%@",[model class]);
NSLog(@"%@",[[model class] className]);
結(jié)果2
結(jié)果
這樣問題就解決了娇掏。
-(id)copyWithZone:(NSZone *)zone{
SRDishTypeModel *model = [[[self class] allocWithZone:zone] init];
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList([self class], &count);
for (int i = 0; i < count; i++) {
objc_property_t property = properties[i];
const char *name = property_getName(property);
NSString *propertyName = [NSString stringWithUTF8String:name];
id value = [self valueForKey:propertyName];
if (value) {
[model setValue:value forKey:propertyName];
}
}
free(properties);
return model;
}
上面方法實(shí)現(xiàn)model
的copy
,但是你會(huì)發(fā)現(xiàn)copy下來(lái)的都為空呕寝。
問題
-(id)copyWithZone:(NSZone *)zone{
SRDishTypeModel *model = [[[NSClassFromString([[self class] className]) class] allocWithZone:zone] init];
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList(NSClassFromString([[self class] className]), &count);
for (int i = 0; i < count; i++) {
objc_property_t property = properties[i];
const char *name = property_getName(property);
NSString *propertyName = [NSString stringWithUTF8String:name];
id value = [self valueForKey:propertyName];
if (value) {
[model setValue:value forKey:propertyName];
}
}
free(properties);
return model;
}
結(jié)果
到這里問題就解決了。
最后附上通過runtime
解析婴梧。
#import "RLMObject+Json.h"
#import <objc/runtime.h>
@implementation RLMObject (Json)
#pragma mark -模型轉(zhuǎn)字典
-(NSMutableDictionary*)rl_keyValues{
NSMutableDictionary *propertyDic = [NSMutableDictionary dictionaryWithCapacity:0];
unsigned int outCount;
//獲取對(duì)象的屬性列表
objc_property_t *properties = class_copyPropertyList(NSClassFromString([[self class] className]), &outCount);
for (int i = 0; i < outCount; i++) {
NSString *name = [NSString stringWithCString:property_getName(properties[i]) encoding:NSUTF8StringEncoding];
id value = [self valueForKey:name];
if (value) {
if ([value isKindOfClass:[RLMArray class]]) {//判斷是否是數(shù)組
//模型數(shù)組轉(zhuǎn)字典數(shù)組成
[propertyDic setObject:[self rl_keyValuesArrayWithObjectArray:value] forKey:name];
}else{
[propertyDic setObject:value forKey:name];
}
}
}
free(properties);
return propertyDic;
}
#pragma mark - 模型數(shù)組 -> 字典數(shù)組
-(NSMutableArray*)rl_keyValuesArrayWithObjectArray:(NSArray *)objectArray{
NSMutableArray *array = [[NSMutableArray alloc]init];
for (RLMObject *obje in objectArray) {
[array addObject:obje.rl_keyValues];
}
return array;
}