Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c ReactiveCocoa:消除subscribeNext:块中的状态_Objective C_Reactive Programming_Reactive Cocoa - Fatal编程技术网

Objective c ReactiveCocoa:消除subscribeNext:块中的状态

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

我的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:][/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
时,这应该将0
y
值插入流中,并且每当转换到
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的“功能”部分有了一个良好的开端。)