使用NSMutableArray推送/弹出的ReactiveCocoa示例?

Nik*_*Nik 17 reactive-cocoa

有人可以提供使用ReactiveCocoa抽象的单行示例来实现这样的事情:

// 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
}]
Run Code Online (Sandbox Code Playgroud)

我看到NSArray的一些扩展被删除,有利于Mantle https://github.com/ReactiveCocoa/ReactiveCocoa/pull/130但是仍然找不到NSArray操作的简单示例.

Chr*_*eux 15

您无法观察数组以进行更改.ReactiveCocoa使用键值观察.顾名思义,它只观察对键控属性(字典成员,属性等)的更改.

可以做的是观察数组属性的变化:

@interface Blah : NSObject
@property (copy, readonly) NSArray *arrayProperty;
@end

// later...
Blah *blah = [Blah new];
[RACObserve(blah, arrayProperty) subscribeNext:^(NSArray *wholeArray){}];
Run Code Online (Sandbox Code Playgroud)

如果您想知道插入/删除了哪些对象,那么您有两个选项.你可以通过存储每个数组并将每个数组与之前的数组进行比较来解决它.这是最简单的,但对于非常大的数组会表现不佳.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;
}];
Run Code Online (Sandbox Code Playgroud)

更改字典会告诉您对数组进行了哪些更改,插入/删除了哪些对象以及插入/删除对象的索引.

它记录在:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html