RACObserve(),RAC() - 如何基于NSString设置BOOL值

时间:2014-05-16 13:26:22

标签: ios reactive-cocoa

作为ReactiveCocoa的新手,我希望能提出一些建议:

我正在尝试创建一个动态表单,其中包含从XML文件解析的多个Field对象。每个Field都可以有多个验证规则,这些规则将针对Field的NSString *value param运行。

对于问题的RAC部分 -

在每个Field对象中,我想将BOOL completed绑定到一个信号,该信号根据一系列规则检查Field的*value参数。到目前为止,我的想法已经到了这里:

@implementation Field

self = [super init];
if (self) {

    RAC(self, completed) = [RACObserve(self, value) filter:^BOOL(NSString *fieldValue) {
        NSLog(@"%s::self.completed = %d\n", sel_getName(_cmd), self.completed);  // trying to watch the values here, with no luck 
        NSLog(@"%s::fieldValue = %@\n", sel_getName(_cmd), fieldValue);  // same here, I'd like to be able to view the `*value` here but so far no luck

        return [self validateCurrentValue]; // currently this method just checks value.length > 5 
    }];
}
return self;

*value param已经绑定到我的视图模型(成功),并且每次文本字段更改时都会更新。

我正在寻找的是一个基本的例子或最佳实践,上面的代码在运行时崩溃所以我知道我缺少一些基本的东西。

全部谢谢

1 个答案:

答案 0 :(得分:5)

-filter:只是将RACObserve(self, value)中的值传递给未更改,但前提是该块返回YES。这意味着您尝试将completed设置为value类型的值。那可能是坏事。

但好消息是你真的很亲密!

您想要转换,而不是过滤。你想要每个value并将其映射到其他东西。即该值是否通过验证。为此,我们使用-map:

RAC(self, completed) = [RACObserve(self, value) map:^(NSString *fieldValue) {
    return @([self validateCurrentValue]);    
}];