ReactiveCocoa:在subscribeNext:block中消除状态

时间:2013-11-06 10:43:25

标签: 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 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:],但没有完全理解。

1 个答案:

答案 0 :(得分:3)

self.viewModel.searchMode执行时,您需要更改三个不同的值,因此我认为您要做的第一件事是split the signal,并将它们分别取出。

RACSignal * searchModeSig = [[RACObserve(self.viewModel, searchMode) distinctUntilChanged] 
                                 publish] 
                             signal];

hidden状态很简单:

RAC(self.searchBarView, hidden) = [searchModeSig not];

我上面使用了distinctUntilChanged因为你对集合视图的y偏移的信号似乎是“0如果searchModeYES,那么最后的非零值”。如果searchMode信号的值连续为YESNO,那么您最终也会在偏移值流中出现重复,这会使用{{1获得你想要的价值。 replayLast仅传递代表从distinctUntilChangedYES的转换的值,反之亦然。

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]]; 过渡y时,这应该将0 searchMode值插入流中,并取以前的值(当然,这可能是已转换为YES时从其他地方更新过。

对于搜索栏的第一个响应者状态,使用NO执行此操作似乎是合理的,但您也可以这样做:

subscribeNext:

您已将RAC(self.searchBar, DLShouldBeFirstResponder) = searchModeSig; becomeFirstResponder调用转换为伪属性,如下所示:

resignFirstResponder

也许lifting将是从信号到命令性调用的“官方”方式,但我不确定如何/如果它适用于无参数方法。