2016-01-13 17 views
7

Nel mio progetto nel tentativo di lavorare tramite MVVM, così in VM in .h file diCome associare le modifiche agli oggetti Realm?

@property (nonatomic, strong) NSArray *cities; 

in .m file di

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

GPCity è un RLMObject sottoclasse Come associare questa via ReactiveCocoa (i significa vedere tutte le città aggiornamenti/aggiunge/rimuove)?

Qualcosa di simile:

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

Avete dato un'occhiata l'esempio ReactiveCocoa nella documentazione Realm? Forse trovi qualcosa lì: https://github.com/realm/realm-cocoa/tree/master/examples/ios/objc/RACTableView – joern

risposta

2

si può avvolgere le notifiche di modifica Realm in un segnale 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 

e poi fare:

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

Ciò purtroppo aggiornare il segnale dopo ogni transazione di scrittura e non solo quelle che mo dify cities. Una volta Realm 0.98 è rilasciato con support for per-RLMResults notifications, sarete in grado di fare quanto segue, che aggiornerà solo quando un oggetto viene aggiornato 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 
+0

Esempio molto bello. Esattamente quello che stavo cercando. Un suggerimento Prima della riga 'addNotificationBlock', suggerirei di fare un' [subscriber sendNext: self]; 'per popolare il valore iniziale nel segnale. –

Problemi correlati