【发布时间】:2015-06-17 22:13:36
【问题描述】:
我创建了一个信号来包装 UITextField 委托方法 textFieldShouldReturn:。
- (RACSignal *)textFieldReturnPressed
{
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[[self rac_signalForSelector:@selector(textFieldShouldReturn:)
fromProtocol:@protocol(UITextFieldDelegate)]
subscribeNext:^(RACTuple *tuple) {
[subscriber sendNext:tuple.first];
}];
return nil;
}];
}
在 viewDidLoad 中,我尝试订阅此信号和按下按钮的组合。实际上,我希望用户能够点击一个按钮并做一些事情(登录),或者按键盘上的返回并做同样的事情(登录)。
我创建了以下信号来组合这两个信号:
RACSignal *loginSignal = [RACSignal
combineLatest:@[[loginButton
rac_signalForControlEvents:UIControlEventTouchUpInside],
[self textFieldReturnPressed]]];
然后我像这样订阅这个事件:
[loginSignal
subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
当我按下键盘上的返回键时,上面的日志不会打印(尽管我已经验证 sendNext 是从信号中调用的)。但是,当我触发登录按钮信号时,日志会打印 ie。 combineLatest 通过信号。
我已经尝试将 startWith:nil 添加到 loginButton 信号,因为正如我在其他帖子/Github 问题中发现的那样,CombineLatest 要求每个信号至少发送一次,但我的流会立即执行。
我确信我可以在那个时候以某种方式过滤以防止流执行,但这感觉有点 hacky。有什么建议吗?
【问题讨论】:
标签: ios objective-c reactive-programming reactive-cocoa