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