作为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已经绑定到我的视图模型(成功),并且每次文本字段更改时都会更新。
我正在寻找的是一个基本的例子或最佳实践,上面的代码在运行时崩溃所以我知道我缺少一些基本的东西。
全部谢谢
答案 0 :(得分:5)
-filter:
只是将RACObserve(self, value)
中的值传递给未更改,但前提是该块返回YES
。这意味着您尝试将completed
设置为value
类型的值。那可能是坏事。
但好消息是你真的很亲密!
您想要转换,而不是过滤。你想要每个value
并将其映射到其他东西。即该值是否通过验证。为此,我们使用-map:
:
RAC(self, completed) = [RACObserve(self, value) map:^(NSString *fieldValue) {
return @([self validateCurrentValue]);
}];