是否有类似$ scope的内容。$ watch for NSMutableArray

时间:2014-05-18 17:02:58

标签: nsmutablearray reactive-cocoa

我一直在努力让这项工作正确无误。我有NSMutableArray的项目。有时在应用程序生命周期中,App会在那里推送和弹出对象。 我通常可以在AngularJS一侧使用$ scope。$ watch。我在此期间一直在使用ReactiveCocoa来做一些这种行为

基本上我喜欢在这些事件上开火。

- (无效)fetchAllItems; - (无效)推:(ID)项目; - (无效)弹出:(NSUInteger)指数;

我尝试使用ReactiveCocoa,但它永远不会发射!

[RACObserve(singletonStore, items) subscribeNext:^(NSArray *wholeArray) {
        NSUInteger count = [wholeArray count];
        [self.offerCircleButton setTitle:[NSString stringWithFormat:@"%d", count]]
 }];

items属性在singletonStore对象中声明为

@property (nonatomic, copy) NSArray *items;

getter和setter用于NSMutableArray作为私有变量

@interface SHSingletonStore()
{
    NSMutableArray *_items;
}
@end

-(NSArray *)items {
    return [_items copy];
}

-(void)setItems:(NSArray *)items{
    if([_items isEqualToArray:items] == NO){
        _items = [items mutableCopy];
    }
}

2 个答案:

答案 0 :(得分:1)

  

基本上我想要阻挡这些事件。

     

- (无效)fetchAllItems; - (无效)推:(ID)项目; - (无效)弹出:(NSUInteger)指数;

如果你要说的是你想要一个在调用任何这些方法时发送值的信号,你可以用-rac_signalForSelector:来做,如下所示:

SEL fetchAllSEL = @selector(fetchAllItems);
RACSignal *fetchAllSignal = [singletonStore rac_signalForSelector:fetchAllSEL];

SEL pushSEL = @selector(push:);
RACSignal *pushSignal = [singletonStore rac_signalForSelector:pushSEL];

SEL popSEL = @selector(pop:);
RACSignal *popSignal = [singletonStore rac_signalForSelector:popSEL];

@weakify(self);
[[RACSignal merge:@[ fetchAllSignal, pushSignal, popSignal ]] subscribeNext:^(id _) {

    @strongify(self);
    [self.offerCircleButton setTitle:[NSString stringWithFormat:@"%d", singletonStore.items.count]]

}];

这个解决方案有点粗略,因为每个合并的信号都会发送不同类型的值(所以你最终得到的信号可以发送3种不同类型的值,这通常不是很酷),但如果你只是忽略了这个值,所以你可以根据一些全局状态执行一些副作用,这并不重要。

答案 1 :(得分:0)

因为您正在实施属性设置器,所以您需要手动触发KVO通知。 您需要发送属性更改的通知。您可以在此处阅读更多内容Apple Documentation

默认情况下,如果您不提供属性实施,它会自动触发这些通知,但如果您提供自定义实施,则需要自行发送这些通知。

- (void)setItems:(NSArray *)items {
    if([_items isEqualToArray:items] == NO) {
        [self willChangeValueForKey:@"items"];
        _items = [items mutableCopy];
        [self didChangeValueForKey:@"items"];
    }
}