Swift中能否同时将对象存入NSUserDefaults与Realm?
解决NSUserDefaults与Realm模型继承冲突的问题
这个问题我之前做项目时也碰到过,OC不支持多继承确实会让人卡壳,给你几个实用的解决思路:
方案一:用组合代替继承,拆分模型职责
不要强行让一个模型同时适配两种存储框架,而是把职责拆分开:
- 创建一个继承自
NSObject的UDUserModel,专门用来处理NSUserDefaults的存储,包含你需要存在本地偏好设置里的属性; - 再创建一个继承自
Object的RealmUserModel,专门负责Realm数据库的存储; - 写简单的转换方法,让两个模型之间可以互相转换数据,各自干各自的活,就不会有继承冲突了。
代码示例:
// 适配NSUserDefaults的模型 @interface UDUserModel : NSObject <NSCoding> @property (nonatomic, copy) NSString *username; @property (nonatomic, assign) NSInteger userId; @end // 适配Realm的模型 @interface RealmUserModel : Object @property (nonatomic, copy) NSString *username; @property (nonatomic, assign) NSInteger userId; @end // 模型转换方法 @implementation UDUserModel + (instancetype)modelFromRealmModel:(RealmUserModel *)realmModel { UDUserModel *model = [[UDUserModel alloc] init]; model.username = realmModel.username; model.userId = realmModel.userId; return model; } @end @implementation RealmUserModel + (instancetype)modelFromUDModel:(UDUserModel *)udModel { RealmUserModel *model = [[RealmUserModel alloc] init]; model.username = udModel.username; model.userId = udModel.userId; return model; } @end
方案二:直接基于Realm模型适配NSUserDefaults
其实你完全不用让模型额外继承NSObject,只要把Realm模型的数据转成字典或JSON格式,就能存到NSUserDefaults里了。Realm的Object本身支持转字典操作,省掉维护两个模型的麻烦:
// 把Realm模型转字典并存入NSUserDefaults RealmUserModel *userModel = ...; NSDictionary *userDict = [userModel dictionaryWithValuesForKeys:@[@"username", @"userId"]]; [[NSUserDefaults standardUserDefaults] setObject:userDict forKey:@"currentUser"]; [[NSUserDefaults standardUserDefaults] synchronize]; // 从NSUserDefaults读取并转回Realm模型 NSDictionary *savedDict = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"currentUser"]; RealmUserModel *savedModel = [[RealmUserModel alloc] initWithDictionary:savedDict];
方案三:检查Realm版本的继承关系
哦对了,还有个小细节:Realm较新版本的Object类本身就是继承自NSObject的!你可以打开Realm的头文件看看Object的定义:
@interface Object : NSObject <RLMObjectBase, RLMThreadConfined>
如果是这种情况,那你只需要让模型继承Object,就自动满足NSUserDefaults的要求了(毕竟NSUserDefaults只要求对象是NSObject子类),之前的冲突可能是因为用了旧版本的Realm?
内容的提问来源于stack exchange,提问作者Marwen Doukh
相关产品推荐
相关产品推荐

