Objective c ReactiveCocoa:消除subscribeNext:块中的状态
我的VC中有以下代码:Objective c ReactiveCocoa:消除subscribeNext:块中的状态,objective-c,reactive-programming,reactive-cocoa,Objective C,Reactive Programming,Reactive Cocoa,我的VC中有以下代码: [RACObserve(self.viewModel, searchMode) subscribeNext:^(NSNumber *value) { @strongify(self); BOOL isSearchMode = [value boolValue]; self.searchBarView.hidden = !isSearchMode; if (isSearchMode) { [self.searchBar bec
[RACObserve(self.viewModel, searchMode) subscribeNext:^(NSNumber *value) {
@strongify(self);
BOOL isSearchMode = [value boolValue];
self.searchBarView.hidden = !isSearchMode;
if (isSearchMode) {
[self.searchBar becomeFirstResponder];
self.yContentOffset = self.collectionView.contentOffset.y;
[self.collectionView setContentOffset:CGPointMake(self.collectionView.contentOffset.x, 0) animated:NO];
} else {
[self.searchBar resignFirstResponder];
[self.collectionView setContentOffset:CGPointMake(self.collectionView.contentOffset.x, self.yContentOffset) animated:NO];
}
}];
其中yContentOffset
是我试图删除的VC属性。(它在进入搜索模式之前保存内容偏移量,然后恢复)
我尝试过
[RACSignal if:then:else:][/code>,但没有完全实现。当self.viewModel.searchMode
完成时,有三个不同的值需要更改,因此我认为您要做的第一件事是分别获取它们
RACSignal * searchModeSig = [[RACObserve(self.viewModel, searchMode) distinctUntilChanged]
publish]
signal];
隐藏状态很简单:
RAC(self.searchBarView, hidden) = [searchModeSig not];
我使用上面的方法是因为,如果searchMode
为YES
,则采集视图的y偏移量的信号似乎为“0,否则为最后一个非零值”。如果searchMode
信号的值依次为YES
或NO
,则偏移值流中也会出现重复,这将导致使用replayLast
获取所需值时出错distinctUntilChanged
只传递表示从YES
到NO
转换的值,反之亦然
RAC(self.collectionView, contentOffset) =
[RACSignal if:searchModeSig
then:[RACSignal return:[NSValue valueWithCGPoint:CGPointMake(self.collectionView.contentOffset.x, 0)]
else:[RACObserve(self.collectionView, contentOffset) replayLast]];
每当searchMode
转换到YES
时,这应该将0y
值插入流中,并且每当转换到NO
时,都应该取上一个值(当然,可以从别处更新)
对于搜索栏的第一响应者状态,使用subscribeNext:
这样做似乎是合理的,但您也可以这样做:
RAC(self.searchBar, DLShouldBeFirstResponder) = searchModeSig;
将becomeFirstResponder
和resignFirstResponder
调用转换为伪属性,如下所示:
@interface UIView (DLFirstResponderProp)
@property (assign, nonatomic) BOOL DLShouldBeFirstResponder;
@end
@implementation UIView (DLFirstResponderProp)
- (void)setDLShouldBeFirstResponder:(BOOL)shouldBe
{
if( shouldBe ){
[self becomeFirstResponder];
}
else {
[self resignFirstResponder];
}
}
- (BOOL)DLShouldBeFirstResponder
{
return [self isFirstResponder];
}
@end
这也可能是从信号调用到命令调用的“官方”方式,但我不确定这在无参数方法中是否有效。你的+if:then:else:尝试是什么样子的?我很高兴听到对此的批评;这个周末我才开始试着了解RAC。这是周末的很多知识)谢谢!嘿,有用吗?伟大的(Scheme是我最早学会的语言之一,因此我对FRP的“功能”部分有了一个良好的开端。)