2 votes

SwiftUI - L'achèvement de l'observation de KV à partir de Combine ne se déclenche pas

J'essaie de construire un VOIP utilisant la librairie appelée VailerSIPLib . Comme la bibliothèque a été construite en utilisant Obj-C et en utilisant massivement NotificationCenter de publier les modifications des états actifs partout.

Je suis actuellement à la CallView Dans le cadre du projet, je peux gérer le début, la fin et le rejet des appels. Cependant, je dois mettre en œuvre connectionStatus dans la vue qui donne des informations sur l'appel comme la durée, "connexion..", "déconnexion", "sonnerie", etc.

Le code ci-dessous est tout entier dans CallViewModel: ObservableObject ;

Variables :

var activeCall: VSLCall!
@Published var connectionStatus: String = ""

Initialisateur :

override init(){
        super.init()
        NotificationCenter.default.addObserver(self, selector: #selector(self.listen(_:)), name: Notification.Name.VSLCallStateChanged, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.buildCallView(_:)), name: Notification.Name.CallKitProviderDelegateInboundCallAccepted, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.buildCallView(_:)), name: Notification.Name.CallKitProviderDelegateOutboundCallStarted, object: nil)
    }

Méthodes :

func setCall(_ call: VSLCall) {
    self.activeCall = call
    self.activeCall.observe(\.callStateText) { (asd, change) in
        print("observing")
        print("\(String(describing: change.oldValue)) to \(String(describing: change.newValue)) for \(call.callId)")
    } 
}

@objc func listen(_ notification: Notification) {
       if let _ = self.activeCall {
           print(self.activeCall.callStateText)
       }    
}

@objc func buildCallView(_ notification: Notification) {
    print("inbound call")
    self.isOnCall = true 
}

Problème :

Il imprime tout sauf le completionBlock en setCall(_:) . listen(_:) valide que l'état du activeCall change et je voudrais l'utiliser directement, mais cela ne fonctionne pas toujours correctement. Il devrait être déclenché lorsque l'appel est répondu par callState valeur de .confirmed mais c'est parfois le cas. C'est ainsi que je saurai qu'il est temps de démarrer le minuteur.

D'autre part, dans l'exemple de projet de la VialerSIPLib ils ont utilisé self.activeCall.addObserver(_:) et cela fonctionne bien. Le problème, c'est qu'il y a une erreur d'exécution au niveau de la méthode, quelque chose comme didObservedValueChange(_:) et les journaux An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.

Enfin, un avertissement jaune figure à l'adresse suivante activeCall.observe(_:) dit

Result of call to 'observe(_:options:changeHandler:)' is unused mais je n'ai rien trouvé à ce sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X