2 Stimmen

Beobachte jedes Element in RACSequence

Ich habe eine Methode auf ParentViewModel, die eine RACSequence von ViewModel-Objekten zurückgibt, wie folgt:

- (RACSequence *) viewModels
{
    return [self.models.rac_sequence map:^id(Model *model) {
        return [[ViewModel alloc] initWithModel: model];
    }];
}

Jedes der ViewModels hat eine status Eigenschaft, die ein Enum ist und 3 Zustände hat: NotStarted, InProgress und Completed. Wenn alle ViewModels in meiner Sequenz den Zustand Completed haben, weiß ich, dass ParentViewModel gültig ist. Ich habe ein validSignal auf dem ParentViewModel, aus dem ich ableiten möchte, dass es gültig ist, basierend auf der viewModels-Sequenz. Im Moment habe ich diesen Code:

BOOL valid = [[self viewModels] all:^BOOL(ViewModel *vm) {
        return vm.state == Completed;
    }];

Das gibt mir einen Indikator, ob alle ViewModels in der Sequenz gültig sind. Wie kann ich das dann in ein RACSignal umwandeln, das sich jedes Mal aktualisiert, wenn sich die status Eigenschaft eines der ViewModels ändert?

5voto

yonosoytu Punkte 3309

Du musst zuerst state in ein RACSignal umwandeln, und dann ist alles ab diesem Punkt einfach.

Der endgültige Code wird ungefähr wie folgt aussehen:

RACSignal *valid = [[RACSignal combineLatest:
                     [[self viewModels] map:^id(ViewModel *viewModel) {
                       return RACAbleWithStart(viewModel, state);
                     }]
                    ]
                    map:^(RACTuple *states) {
                      return @([states.rac_sequence all:^BOOL(NSNumber *state) {
                        return state.unsignedIntegerValue == Completed;
                      }]);
                    }
                   ];

Der erste Block bildet jede deiner View-Modelle in ein Signal ab, das die Eigenschaft state beobachtet (mit dem Startwert als ersten Wert des Signals).

combineLatest: nimmt eine Sammlung von RACSignals und erstellt ein neues Signal, das jedes Mal ausgelöst wird, wenn eines der zugrunde liegenden Signale sich ändert, und sendet ein RACTuple mit dem Wert jedes Signals.

Dieser RACTuple wird dann in eine RACSequence umgewandelt, und wir können einen Wert von @YES oder @NO generieren, abhängig davon, ob alle Werte Completed sind oder nicht.

Ich denke, das ist das Signal, nach dem du gesucht hast.

(Haftungsausschluss: Ich bin neu in ReactiveCocoa, es gibt möglicherweise einen einfacheren Weg).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X