首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用NSMutableArray推送/弹出的ReactiveCocoa示例?

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

Stack Overflow用户
提问于 2013-09-13 20:23:14
回答 1查看 6K关注 0票数 18

谁能提供一个使用ReactiveCocoa抽象来实现以下内容的简单示例:

代码语言:javascript
复制
// 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 https://github.com/ReactiveCocoa/ReactiveCocoa/pull/130,但仍然找不到NSArray操作的简单示例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-13 21:01:55

你不能观察一个数组的变化。ReactiveCocoa使用键值观察。顾名思义,它只观察键控属性(字典成员、属性等)的变化。

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

代码语言:javascript
复制
@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观察更改信息要稍微复杂一些:

代码语言:javascript
复制
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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18786226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档