reactive-cocoa

reactive cocoa - Ejemplo de ReactiveCocoa con NSMutableArray push/pop?



reactive-cocoa (2)

¿Podría alguien proporcionar un ejemplo de una línea del uso de abstracciones de ReactiveCocoa para lograr algo como esto:

// pseudo-code NSMutableArray *array = @[[] mutableCopy]; RACSignal *newValue = RACAbleWithStart(array); // get whole array or maybe just added/removed element on push/pop [newValue subscribeNext:^(NSArray *x) { // x is whole array }] [newValue subscribeNext:^(id x) { // x is new value }] [newValue subscribeNext:^(id x) { // x is removed value }]

Veo que algunas extensiones para NSArray se eliminaron a favor de Mantle https://github.com/ReactiveCocoa/ReactiveCocoa/pull/130 Pero aún no puedo encontrar un ejemplo simple de manipulación de NSArray.


El equivalente veloz para la solución de Chris:

let signal = self.object.rac_valuesAndChangesForKeyPath("property", options: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old, observer:self.object) signal.subscribeNext { (object) -> Void in if let tuple = object as? RACTuple { var wholeArray = tuple.first as? NSArray var changeDictionary = tuple.second as? NSDictionary } }

También asegúrese de cambiar la propiedad de su contenido de forma compatible con KVO.

// This is wrong and wont send values to RAC signals [self.contents addObject:object]; // This is correct and will send values to RAC signals NSMutableArray *contents = [account mutableArrayValueForKey:@keypath(self, contents)]; [contents addObject:object];

Editar: Para aclarar las cosas, ponga el nombre de su matriz en lugar de propiedad. Por ejemplo:

lazy var widgets:NSMutableArray = NSMutableArray() let signal = self.rac_valuesAndChangesForKeyPath("widgets", options: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old, observer:self)


No se puede observar una matriz para cambios. ReactiveCocoa utiliza la observación clave-valor. Lo que, como su nombre indica, solo observa cambios en los atributos con clave (miembros del diccionario, propiedades, etc.).

Lo que puedes hacer es observar una propiedad de matriz para los cambios:

@interface Blah : NSObject @property (copy, readonly) NSArray *arrayProperty; @end // later... Blah *blah = [Blah new]; [RACObserve(blah, arrayProperty) subscribeNext:^(NSArray *wholeArray){}];

Si desea saber qué objetos se insertaron / eliminaron, entonces tiene dos opciones. Podrías resolverlo almacenando cada matriz y comparándolas con la anterior. Esto es lo más simple pero funcionará mal con arreglos muy grandes. AFAIK, ReactiveCocoa no tiene operaciones integradas para hacer esto.

O puede implementar accesores de colección KVO y asegurarse de que los cambios en la matriz se realicen utilizando mutableArrayValueForKey: Esto evita la creación de una nueva matriz cada vez que se realizan cambios, y también notifica a los observadores de los cambios realizados en la matriz de proxy devueltos por mutableArrayValueForKey:

Observar la información del cambio con ReactiveCocoa es un poco más complicado:

RACSignal *changeSignal = [blah rac_valuesAndChangesForKeyPath:@keypath(blah, arrayProperty) options: NSKeyValueObservingOptionNew| NSKeyValueObservingOptionOld observer:nil]; [changeSignal subscribeNext:^(RACTuple *x){ NSArray *wholeArray = x.first; NSDictionary *changeDictionary = x.second; }];

El diccionario de cambios le indica qué tipo de cambio se realizó en la matriz, qué objetos se insertaron / eliminaron, y los índices de los objetos insertados / eliminados.

Está documentado en: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html