Wie abonniere ich ein Signal von Signal ohne flattenMap direkt, wenn ich ReactiveCocoa verwende?
-
21-12-2019 - |
Frage
Ich habe eine Methode, die ein Signal von Signal zurückgibt und die ich verwenden muss flattenMap
um den im Signal eingeschlossenen Wert zu extrahieren.Erst danach kann ich subscribeNext:complete verwenden:um den Wert zu erhalten.
Der Code sieht wie folgt aus:
- (RACSignal *)publicSignal {
return [[self privateSignal] map:^id(NSString *code) {
return [self chainingSignalUsingCode:code];
}];
};
[[[obj publicSignal] flattenMap:^id(id value) {
return value;
}] subscribeNext:^(NSString *someValue) {
// extract the value;
} completed:^{
// something to do..
}];
Gibt es eine Möglichkeit, das zu beseitigen flattenMap
code, damit ich den direkt abonnieren kann publicSignal
?
Danke im Voraus.
Lösung
Nun, du könntest einfach das machen flattenMap
inneren publicSignal
...
- (RACSignal *)publicSignal {
return [[[self privateSignal] map:^id(NSString *code) {
return [self chainingSignalUsingCode:code];
}] flattenMap:^(id value) {
return value;
}];
}
[[obj publicSignal] subscribeNext:^(NSString *someValue) {
// extract the value;
} completed:^{
// something to do..
}];
Aber warum sind wir dann map
pingen und dann sofort flattenMap
ping?Wir können einfach sagen:
- (RACSignal *)publicSignal {
return [[self privateSignal] flattenMap:^(NSString *code) {
return [self chainingSignalUsingCode:code];
}];
}
[[obj publicSignal] subscribeNext: ...
Um den gleichen Effekt zu erzielen.
Denken Sie daran, dass flattenMap
extrahiert nicht wirklich "den Wert im Signal." Es extrahiert aller die Werte von aller Signal.Wenn privateSignal
sendet neue Signale, publicSignal
geht als nächstes für jeder schätzen Sie das jeder signal sendet - es wird sich im Grunde an alle vergangenen Signale erinnern, die privateSignal
sendet und leitet alle ihre Nächsten durch.Wenn es das ist, was du willst, dann großartig, es funktioniert.Wenn Sie jedoch nur das neueste Signal "auspacken" möchten, verwenden Sie switchToLatest
statt flattenMap
.
Wenn Sie nicht ändern möchten publicSignal
, und Sie möchten, dass es ein Signal von Signalen ist, können Sie das einfachere verwenden flatten
methode und abonniere das:
[[[obj publicSignal] flatten] subscribeNext: ...
Da flattenMap
ohne etwas zu tun ist gleichbedeutend mit flatten
(tatsächlich flatten
wird als implementiert flattenMap
das gibt nur seinen Wert zurück).Oder, wenn Sie nur die nächsten von dem zuletzt gesendeten Signal abonnieren möchten:
[[[obj publicSignal] switchToLatest] subscribeNext: ...
Aber solange es sich um ein Signal von Signalen handelt, müssen Sie eine Operation ausführen, um es zu "entpacken".es gibt keinen Helfer flattenAndThenSubscribe
methode - was gut ist.Sie können den gewünschten Effekt durch die Komposition einfacher Grundelemente erzielen.