reactive-cocoa - NSMutableArray推送/弹出的ReactiveCocoa示例?

标签 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
}]


我看到为支持Mantle https://github.com/ReactiveCocoa/ReactiveCocoa/pull/130而删除了NSArray的某些扩展,但仍然找不到简单的NSArray操作示例。

最佳答案

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

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

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

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


如果要知道插入/删除了哪些对象,则有两个选择。您可以通过存储每个数组并将每个数组与先前的数组进行比较来解决。这是最简单的方法,但是在非常大的阵列上执行效果会很差。 AFAIK,ReactiveCocoa没有内置操作来执行此操作。

或者,您可以实现KVO collection accessors并确保使用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

关于reactive-cocoa - NSMutableArray推送/弹出的ReactiveCocoa示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18786226/

相关文章:

ios - 为什么 RACCommand 的 block 返回信号?

ios - ReactiveCocoa 和代表

swift - 将闭包作为参数传递时,ReactiveCocoa 保留循环

ios - 如何使用 ReactiveCocoa 移除观察者?

swift - Alamofire 3.0 ReactiveCocoa 转换

objective-c - 向 RACSubscriber 发送错误时需要返回吗?

ios - react swift : How to write a Task Scheduler

swift - 具有非可选值的空可变属性

objective-c - ReactiveCocoa 信号,用于在观察身份验证状态时获取数据

iphone - 如何在 ReactiveSwift 中中断 SafeSignal?