微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 如何绑定Realm对象的更改?

在我的项目中,我试图通过MVVM工作,
所以在.h文件中的VM中
@property (nonatomic,strong) NSArray    *cities;

在.m文件

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

GPCity是一个RLMObject子类
如何通过ReactiveCocoa绑定此(我的意思是看所有城市更新/添加/删除)?

就像是:

RAC(self,cities) = [[GPCity allObjects] map:(GPCity *)city {return city.name;}];

解决方法

您可以在RAC信号中包装Realm更改通知
@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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐