gpt4 book ai didi

ios - 如何使用 ReactiveCocoa 来满足这种情况

转载 作者:行者123 更新时间:2023-11-29 00:14:03 25 4
gpt4 key购买 nike

我有一种情况,我想将来自特定源信号的事件拆分为两个信号,一个立即发出事件,另一个延迟 3 秒发出事件。其余的原始事件总是立即发出新事件。但是,如果在延迟事件发出之前新事件到达原始信号,则应丢弃延迟事件。

像这样的 enter image description here

我将每个原始信号映射到CS1(用于立即发出的事件),并将原始信号的特定事件过滤到CS2(用于延迟发出的事件)enter image description here enter image description here

然后我将 CS1CS2 合并到 CS3 中,这不会丢弃 S2

所以,我的问题是如何丢弃或取消 S2,以及如何在不使用额外临时变量的情况下使用 RAC 实现这种情况?

ReactiveCocoa 2.x当前代码

RACSignal* origin = …    
RACSignal* CS1 = [origin map:^id _Nullable(id _Nullable value) {
return @(YES);
}];
RACSignal* CS2 = [[[origin filter:^BOOL(id _Nullable value) {
return [RACSignal empty];
}] delay:3] map:^id _Nullable(id _Nullable value) {
return @(NO);
}];
RACSignal* CS3 = [RACSignal merge:@[CS1, CS2]];

最佳答案

一个与实际问题无关的评论:filter 应该返回一个 bool 值,如果应该发送该元素,则为 YES,如果应该发送,则为 NO元素应该被过滤掉。

实际问题:

问题的解决方案是使用takeUntil。但是,如果您将 takeUntil 直接应用于 CS2,一旦事件到达 CS1,整个 CS2 将被取消。

解决方案是使用flatMap,为延迟元素构建一个新的RACSignal,然后对该内部信号使用takeUntil

为了清晰起见,我将单个步骤拆分为多个临时信号(我还更改了 mapfilter 以便在尝试时可以更好地了解发生了什么在我的示例中,您应该能够轻松地在那里使用正确的功能):

RACSignal* CS1 = [self.origin map:^id _Nullable(NSNumber * _Nullable value) {
return value;
}];

RACSignal *filtered = [self.origin filter:^BOOL(NSNumber * _Nullable value) {
return (value.integerValue % 2) == 0;
}];

RACSignal *delayed = [filtered flattenMap:^__kindof RACSignal * _Nullable(id _Nullable value) {
// Build a new signal that returns just this one value,
// but delayed and only if no event arrives on CS1
return [[[RACSignal return:value]
delay:3]
takeUntil:CS1];
}];

RACSignal* CS2 = [delayed map:^id _Nullable(NSNumber * _Nullable value) {
return @(-value.integerValue);
}] ;


RACSignal* CS3 = [RACSignal merge:@[CS1, CS2]];

您可以轻松地将其折叠成两个信号

RACSignal *CS2 = [[[self.origin filter:^BOOL(NSNumber * _Nullable value) {
return (value.integerValue % 2) == 0;
}] flattenMap:^__kindof RACSignal * _Nullable(id _Nullable value) {
// Build a new signal that returns just this one value,
// but delayed and only if no event arrives on CS1 before
return [[[RACSignal return:value]
delay:3]
takeUntil:CS1];
}] map:^id _Nullable(NSNumber * _Nullable value) {
return @(-value.integerValue);
}];

我创建了 a sample project on github演示解决方案。

关于ios - 如何使用 ReactiveCocoa 来满足这种情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45712086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com