Ответ 1
Вы не можете наблюдать массив для изменений. ReactiveCocoa использует наблюдение за ключом. Который, как следует из названия, только наблюдает за изменениями атрибутов с ключом (словарные элементы, свойства и т.д.).
Что вы можете сделать, так это наблюдать свойство массива для изменений:
@interface Blah : NSObject
@property (copy, readonly) NSArray *arrayProperty;
@end
// later...
Blah *blah = [Blah new];
[RACObserve(blah, arrayProperty) subscribeNext:^(NSArray *wholeArray){}];
Если вы хотите узнать, какие объекты вставлены/удалены, у вас есть два варианта. Вы можете это решить, сохранив каждый массив и сравнив каждый с предыдущим. Это простейший, но он будет плохо работать с очень большими массивами. AFAIK, ReactiveCocoa не имеет встроенных операций для этого.
Или вы могли бы реализовать аксессоры коллекции KVO и убедиться, что изменения в массиве сделаны с помощью mutableArrayValueForKey:
. Это позволяет избежать создания нового массива всякий раз, когда происходят какие-либо изменения, а также уведомляет наблюдателей об изменениях, внесенных в массив прокси, возвращаемый mutableArrayValueForKey:
.
Наблюдение информации об изменении с помощью ReactiveCocoa несколько больше связано:
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;
}];
Словарь изменений сообщает, какие изменения были внесены в массив, какие объекты были вставлены/удалены, а также индексы вставленных/удаленных объектов.
Документируется по адресу: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html