Wie abonniere ich ein Signal von Signal ohne flattenMap direkt, wenn ich ReactiveCocoa verwende?

StackOverflow https://stackoverflow.com//questions/23015828

  •  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.

War es hilfreich?

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 mappingen und dann sofort flattenMapping?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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top