在我的项目中,我试图通过 MVVM 工作,
所以在 VM 中的 .h
文件
@property (nonatomic, strong) NSArray *cities;
在.m
文件中
- (NSArray *)cities {
return [[GPCity allObjects] valueForKey:@"name"];
}
GPCity
是 RLMObject
的子类
如何通过 ReactiveCocoa 绑定(bind)它(我的意思是查看所有城市更新/添加/删除)?
类似于:
RAC(self, cities) = [[GPCity allObjects] map:(GPCity *)city {return city.name;}];
最佳答案
您可以将 Realm 更改通知包装在 RAC 信号中:
@interface RLMResults (RACSupport)
- (RACSignal *)gp_signal;
@end
@implementation RLMResults (RACSupport)
- (RACSignal *)gp_signal {
return [RACSignal createSignal:^(id<RACSubscriber> subscriber) {
id token = [self.realm addNotificationBlock:^(NSString *notification, RLMRealm *realm) {
if (notification == RLMRealmDidChangeNotification) {
[subscriber sendNext:self];
}
}];
return [RACDisposable disposableWithBlock:^{
[self.realm removeNotification:token];
}];
}];
}
@end
然后做:
RAC(self, cities) = [[[RLMObject allObjects] gp_signal]
map:^(RLMResults<GPCity *> *cities) { return [cities valueForKey:@"name"]; }];
不幸的是,这将在每次 写入事务后更新信号,而不仅仅是修改城市的事务。一旦 Realm 0.98 发布 support for per-RLMResults notifications ,您将能够执行以下操作,这只会在 GPCity
对象更新时更新:
@interface RLMResults (RACSupport)
- (RACSignal *)gp_signal;
@end
@implementation RLMResults (RACSupport)
- (RACSignal *)gp_signal {
return [RACSignal createSignal:^(id<RACSubscriber> subscriber) {
id token = [self addNotificationBlock:^(RLMResults *results, NSError *error) {
if (error) {
[subscriber sendError:error];
}
else {
[subscriber sendNext:results];
}
}];
return [RACDisposable disposableWithBlock:^{
[token stop];
}];
}];
}
@end
关于ios - 如何绑定(bind) Realm 对象的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34768815/