ReactiveCocoa观察两个属性

时间:2014-07-02 08:29:03

标签: iphone ios7 objective-c++ reactive-cocoa

我需要检查两个值并根据这两个值设置条件,返回一个NS_ENUM值。

来自ReactiveCocoa github readme,我发现了这个

RAC(self, createEnabled) = [RACSignal 
    combineLatest:@[ RACObserve(self, password), RACObserve(self, passwordConfirmation) ] 
    reduce:^(NSString *password, NSString *passwordConfirm) {
        return @([passwordConfirm isEqualToString:password]);
    }];

它检查两个值,密码和密码确认在一起。我试着稍微修改它来观察两个BOOL属性,它向我显示“不兼容的块指针类型”错误..

RAC(self, showButtonOption) = [RACSignal
                                    combineLatest:@[ RACObserve(self, setting), RACObserve(self, billing) ]
                                    reduce:^(NSSet *setting, NSSet *billing) {
                                        if ([billing containsObject:kBillingExpired]) {
                                            return DialerShowButtonPurchase;
                                        } else if ([setting containsObject:kSettingEnableRecord]) {
                                            return DialerShowButtonRecord;
                                        } else {
                                            return DialerShowButtonCall;
                                        }
                                    }];

我不知道出了什么问题,应该用什么正确的语法来达到目的?

1 个答案:

答案 0 :(得分:3)

好吧,让我们看看该方法的签名是什么:

+ (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals
                      reduce:(id ( ^ ) ( ))reduceBlock

您尝试从reduceBlock返回枚举值(基元),该值必须具有id的返回类型。

这是ReactiveCocoa令人烦恼但又不可避免的一个方面:你需要装箱。很多。如果您返回@(DialerShowButtonPurchase)(等),您实际上将返回NSNumber *,这是id,因此它会进行编译。

RAC宏会自动将其展开,以便showButtonOption不需要声明为NSNumber *