我一直在努力让这项工作正确无误。我有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];
}
}
答案 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"];
}
}