2016-01-13 13 views
7

In meinem Projekt im über MVVM, zu arbeiten so in VM in .h Datei versuchtWie binden Realm Objekte Änderungen?

@property (nonatomic, strong) NSArray *cities; 

in .m Datei

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

GPCity ist eine RLMObject Unterklasse Wie dies über ReactiveCocoa binden (i meinst du alle Städte Updates/fügt hinzu/entfernt)?

Etwas wie:

@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 

und dann tun: nach

RAC(self, cities) = [[[RLMObject allObjects] gp_signal] 
        map:^(RLMResults<GPCity *> *cities) { return [cities valueForKey:@"name"]; }]; 

Das wird leider das Signal aktualisieren

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

Haben Sie einen Blick auf das ReactiveCocoa Beispiel im Bereich docs? Vielleicht findest du dort etwas: https://github.com/realm/realm-cocoa/tree/master/examples/ios/objc/RACTableView – joern

Antwort

2

Sie Realm Änderungsbenachrichtigungen in einem RAC-Signal wickeln kann jede schreiben Transaktion, und nicht nur diejenigen, die mo dify Städte. Sobald Realm 0.98 mit support for per-RLMResults notifications freigegeben wird, können Sie folgendes tun, die nur aktualisiert wird, wenn ein GPCity Objekt aktualisiert:

@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 
+0

Sehr schönes Beispiel. Genau das, was ich gesucht habe. Ein Vorschlag. Vor der 'addNotificationBlock'-Zeile würde ich vorschlagen, einen' [subscriber sendNext: self]; ''zu machen, um den Anfangswert in dem Signal zu füllen. –