3

考虑以下代码段:

- (RACSignal *)startRouting {
...
}

- (RACSignal *)updateRoutingWithSession:(NSString *)session {
...
}

- (RACSignal *)fetchFlights {
    return [[self startRouting] flattenMap:^RACStream *(NSString *session) {
        return [[[[self updateRoutingWithSession:session]
                        delay:2.0f]
                        repeat]
                        takeUntilBlock:^BOOL(RACTuple *operationAndResponse) {
                            AFHTTPRequestOperation *operation = [operationAndResponse first];
                            NSDictionary *response = [operationAndResponse second];
                            return [operation isCancelled] || 100 == [response[kPercentComplete] intValue];
                        }];
    }];
}

这里发生的是startRouting返回RACSignal发送会话 ID 的 a 。 updateRoutingWithSession:返回 a RACSignal,它发送包含属性的NSDictionary外观。PercentComplete民意调查之间有两秒钟的延迟。

fetchFlights将运行直到updateRoutingWithSession:PercentComplete100 个。

我的问题是最后一个sendNext:,即takeUntilBlock返回的地方true,没有到达RACSubscriber.

我错过了什么?

4

2 回答 2

2

我在 RX 的世界里发现了这个。这通常通过合并两个信号来解决。一种在谓词为真之前采用重复来源的方法。另一个在谓词为真时跳过。

这看起来像这样

 BOOL (^finished)(id _) = ^BOOL(id _) {
    return predicate; // BOOLean here
}

// You want a multicast signal, because multiple signals will subscribe to the source.
// Multicasting it means that you won't get repeated api-requests, in this case.
RACMulticastConnection *source = [[theSignal repeat] publish];

RACSignal *whileNotDone = [source.signal takeUntilBlock:finished];
RACSignal *whenDone = [[source.signal skipUntilBlock:finished] take:1];
RACSignal *merged = [RACSignal merge:@[whileNotDone, whenDone]];

[source connect]; // Needed for a multicast signal to initiate.

merged信号将包括最后一个sendNext。然后。nextsourcesendCompleted

来自 RX 世界的一些参考资料:

于 2013-04-17T09:31:13.527 回答
1

澄清一下:你的问题是next触发完成的那个没有被发送出去?takeUntilBlock将传播下一个,直到谓词为 NO。(文档)因此,next不会发送最后一个。但是您可以订阅completion在这种情况下应该发生的情况。

于 2013-04-03T14:15:50.777 回答