Come sottoscrivere direttamente un segnale di segnale senza flattrenmap quando si utilizza ReactiveCoa?

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

  •  21-12-2019
  •  | 
  •  

Domanda

Ho un metodo che restituisce un segnale di segnale e devo usare flattenMap per estrarre il valore avvolto nel segnale.Dopodiché solo posso usare AbbisiNext: Completa: per ottenere il valore.

Il codice sembra il seguente:

- (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..
}];
.

C'è un modo per eliminare il codice flattenMap in modo che io possa iscriversi direttamente al publicSignal?

Grazie in anticipo.

È stato utile?

Soluzione

Beh, potresti semplicemente fare il flattenMap all'interno 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..
}];
.

Ma allora perché siamo generatoritagcodeping e poi subito mapping? Possiamo solo dire:

- (RACSignal *)publicSignal {
    return [[self privateSignal] flattenMap:^(NSString *code) {
       return [self chainingSignalUsingCode:code];
    }];
}

[[obj publicSignal] subscribeNext: ...
.

per ottenere lo stesso effetto.

Tenere presente che flattenMap non è veramente "estraendo il valore nel segnale". Estrazione tutti i valori da tutti i segnali. Quando flattenMap invia nuovi segnali, privateSignal sta andando Avanti per OGNI Valore OGNI Invia il segnale - Fondamentalmente ricorderà tutti i segnali passati che publicSignal invia e inoltrano tutti i loro Nexts attraverso. Se questo è quello che vuoi, allora fantastico, funziona. Ma se vuoi solo "scartare" l'ultimo segnale, utilizzare privateSignal anziché switchToLatest.

Se non si desidera modificare flattenMap, e si desidera che sia un segnale di segnali, è possibile utilizzare il metodo publicSignal più semplice e iscriversi a questo:

[[[obj publicSignal] flatten] subscribeNext: ...
.

Poiché flatten senza fare nulla è equivalente a flattenMap (in effetti flatten viene implementato come flatten che restituisce solo il suo valore). Oppure, se vuoi solo iscriverti a Nexts dall'ultimo segnale invia:

[[[obj publicSignal] switchToLatest] subscribeNext: ...
.

Ma fino a quando è un segnale di segnali, è necessario eseguire qualche operazione per "scartarlo". Non c'è un metodo flattenMap Helper - che è buono. Puoi ottenere l'effetto che vuoi attraverso la composizione di semplici primitivi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top