ios - 如何绑定(bind) Realm 对象的变化?

标签 ios mvvm realm reactive-cocoa

在我的项目中,我试图通过 MVVM 工作, 所以在 VM 中的 .h 文件

  @property (nonatomic, strong) NSArray    *cities;

.m文件中

  - (NSArray *)cities {
        return [[GPCity allObjects] valueForKey:@"name"];
    }

GPCityRLMObject 的子类 如何通过 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/

相关文章:

javascript - Knockout.js 更新数组中的数组

ios - 当iOS由于缺少最近的使用而自动卸载应用程序时,本地Realm DB会发生什么情况?

arrays - Realm 对象返回零(Swift)

c# - 更新属性和乒乓球事件

c# - View 在屏幕上时如何修改 XAML 元素的颜色?

ios - 在应用程序生命周期的中间将本地 Realm 转换为同步 Realm (在 Swift 中)

iphone - 在 iOS 中用手指绘制贝塞尔曲线?

iphone - 如何检查字体在 iOS 版本中是否可用?

ios - UIImage 大于自定义 UITableViewCell

ios - CoreAudio 的首选语言