Reactive cocoa 使用NSMutableArray push/pop的ReactiveCocoa示例?

Reactive cocoa 使用NSMutableArray push/pop的ReactiveCocoa示例?,reactive-cocoa,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)

是否有人可以提供一个使用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
}]

我看到NSArray的一些扩展被删除,取而代之的是Mantle,但仍然找不到简单的NSArray操作示例。

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

您可以做的是观察数组属性的更改:

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

// later...
Blah *blah = [Blah new];
[RACObserve(blah, arrayProperty) subscribeNext:^(NSArray *wholeArray){}];
如果要知道插入/删除了哪些对象,则有两个选项。您可以通过存储每个数组并将每个数组与前一个数组进行比较来解决这个问题。这是最简单的,但在非常大的阵列中性能会很差。好吧,ReactiveCocoa没有内置的操作来实现这一点

或者,您可以使用
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;
}];
更改字典告诉您对数组进行了何种更改,插入/删除了哪些对象,以及插入/删除对象的索引


记录在:

克里斯溶液的swift等效物:

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
    }
}
另外,请确保以符合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];
编辑: 为了让事情更清楚,请将数组的名称替换为属性。例如:

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

值得一提的是,要在
changeDictionary
上获取新旧值,只需使用
NSKeyValueChangeOldKey
NSKeyValueChangeNewKey
键即可。我基于@ChrisDevereux创建了一个简单的answer@apouche您的博客帖子链接已断开。以下是正确的链接(对于其他人):对不起,我不知道,但是我在swift中为“财产”写了什么?我有一个整数数组,当我更新该数组时,我希望通过RAC更新,然后更新UI。这里是我到目前为止的要点,但当我尝试创建信号时,它崩溃了。在您的示例中,应该使用“numberArray”。另外,为了让事情更清楚,我将我的属性定义为“lazy-var-widgets:NSMutableArray=NSMutableArray()”,其中我使用的是“widgets”而不是“property”。我已经更新了上面的问题。