0

Je dois migrer une application de ReactiveCocoa 4 à ReactiveCocoa 5 (en raison de Swift 3 migration)la migration RACSubject à ReactiveCocoa 5 (Swift 3)

L'ancienne implémentation utilise des instances de RACSubject pour le déclenchement (performOperationSubject.sendNext) un l'exploitation et pour le traitement (didOperationSubject.subscribeNext) le résultat

internal class MyClass { 

internal var performOperationSubject: RACSubject = RACSubject() 
internal var didOperationSubject: RACSubject = RACSubject() 

internal overide init() { 
    super.init() 
    self.performOperationSubject.subscribeNext { [weak self](_) in 
    guard let strongSelf = self else { return } 
    strongSelf.didOperationSubject.sendNext(result) 

} 

} 

et lorsque l'instance de MyClass est utilisé

myClassInstance.didOperationSubject.subscribeNext { ... } 

myClassInstance.performOperationSubject.sendNext(value) 

Malheureusement le RACSubject n'est plus présent dans ReactiveCocoa 5 (ReactiveSwift)

Comment puis-je remplacer le RACSubject dans ce contexte?

Répondre

2

Vous utiliseriez pipe qui vous donne un observateur d'entrée et un signal de sortie au lieu d'utiliser un RACSubject pour l'entrée et la sortie. The example from the ReactiveSwift docs ressemble à ceci:

let (signal, observer) = Signal<String, NoError>.pipe() 

signal 
    .map { string in string.uppercased() } 
    .observeValues { value in print(value) } 

observer.send(value: "a")  // Prints A 
observer.send(value: "b")  // Prints B 
observer.send(value: "c")  // Prints C 

En utilisant Signal.pipe au lieu de RACSubject:

Comme le type de signal, comme RACSubject, est toujours « chaud », il existe une méthode de classe spéciale pour créer un signal contrôlable. La méthode Signal.pipe peut remplacer l'utilisation de sujets et exprime mieux l'intention en séparant l'API d'observation de l'API d'envoi.

Pour utiliser un tuyau, mettre en place des observateurs sur le signal comme souhaité, puis envoyer des valeurs à l'évier:

let (signal, observer) = Signal<String, NoError>.pipe() 

signal.observeValue(value in 
    // use value 
}) 

observer.send(value: "the value") 
+0

J'ai trouvé une référence plus précise sur cette question sur le changement ReactiveCocoa journal https: // github.com/ReactiveCocoa/ReactiveCocoa/blob/master/CHANGELOG.md#using-signalpipe-instead-of-racsubject – cristallo