我有一个带有标题的Product
模型:
@interface Product : RLMObject <NSCopying,NSCoding>
{
}
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *thumbnailURL;
@property (nonatomic, strong) UIImage *thumbnail;
-(id)initWithInfo:(NSDictionary*)dictionary;
-(UIImage*)getThumbnail;
和实施:
@implementation Product
-(id)initWithInfo:(NSDictionary*)dictionary
{
self = [self init];
if (self) {
_title = dictionary[@"title"];
_thumbnailURL = dictionary[@"thumbnailURL"];
_thumbnail = [self getThumbnail];
}
return self;
}
-(UIImage*)getThumbnail
{
if (_thumbnail) {
return _thumbnail;
}
//load image from cache
return [self loadImageFromCache];
}
现在,当我尝试创建一个Product
对象并将其插入Realm
时,我总是得到异常
[RLMStandalone_Product getThumbnail]: unrecognized selector sent to instance 0xcd848f0'
现在,我删除了_thumbnail = [self getThumbnail];
,它运行正常。但后来我又得到了另一个例外
[RLMStandalone_Product title]: unrecognized selector sent to instance 0xd06d5f0'
当我重新加载我的观点时我在主线程中创建了我的Product
对象,所以使用它的属性和方法应该没问题,不是吗?
任何建议都将不胜感激!
答案 0 :(得分:3)
因为Realm对象属性由数据库而不是内存中的ivars支持,所以访问这些属性&#39;不支持ivars。我们目前正在澄清我们的文档以表达这一点:
请注意,您只能在创建或获取的线程上使用对象,不能直接访问任何持久性属性的ivars,并且不能覆盖持久性属性的getter和setter。< / p>
因此,要与Realm合作,您的模型应该如下所示:
@interface Product : RLMObject
@property NSString *title;
@property NSString *thumbnailURL;
@property (nonatomic, strong) UIImage *thumbnail;
@end
@implementation Product
-(UIImage*)thumbnail
{
if (!_thumbnail) {
_thumbnail = [self loadImageFromCache];
}
return _thumbnail;
}
-(UIImage*)loadImageFromCache
{
// Load image from cache
return nil;
}
+(NSArray*)ignoredProperties
{
// Must ignore thumbnail because Realm can't persist UIImage properties
return @[@"thumbnail"];
}
@end
此模型的用法可能如下所示:
[[RLMRealm defaultRealm] transactionWithBlock:^{
// createInDefaultRealmWithObject: will populate object keypaths from NSDictionary keys and values
// i.e. title and thumbnailURL
[Product createInDefaultRealmWithObject:@{@"title": @"a", @"thumbnailURL": @"http://example.com/image.jpg"}];
}];
NSLog(@"first product's image: %@", [(Product *)[[Product allObjects] firstObject] thumbnail]);
请注意initWithInfo
是如何必要的,因为RLMObject
已经有initWithObject:
而createInDefaultRealmWithObject:
已经这样做了。