Je peux spécifier le planificateur comme RunLoop.main
mais je n'ai pas trouvé de moyen natif de fournir l'information associée à l'adresse de l'utilisateur. RunLoop.Mode
mode pour recevoir des éléments d'un éditeur.
Pourquoi ai-je besoin de ça ? Je mets à jour une cellule de tableView à partir de mon éditeur, mais l'interface utilisateur ne se met pas à jour si l'utilisateur fait défiler la page, elle se met à jour dès que l'interaction de l'utilisateur ou le défilement s'arrête. C'est un comportement connu pour les scrollViews. mais je veux que mon contenu soit affiché dès que possible, et le fait de pouvoir spécifier le mode de suivi de la boucle d'exécution permettrait de résoudre ce problème.
Combinez les API : Je ne pense pas que le receive(on:options:)
méthode ont des options correspondantes pour fournir cela. Je pense qu'en interne, si j'appelle receive(on:RunLoop.main)
puis RunLoop.main.perform { }
est appelé. Cette méthode d'exécution peut prendre le mode comme paramètre mais cela n'est pas exposé à l'API de Combine.
Idée actuelle : Pour contourner ce problème, je pourrais effectuer l'action d'exécution moi-même et ne pas utiliser l'API Combine, donc au lieu de faire ceci :
cancellable = stringFuture.receive(on: RunLoop.main) // I cannot specify the mode here
.sink { string in
cell.textLabel.text = string
}
Je pourrais le faire :
cancellable = stringFuture.sink { string in
RunLoop.main.perform(inModes: [RunLoop.Mode.common]) { // I can specify it here
cell.textLabel.text = string
}
}
Mais ce n'est pas l'idéal.
Solution idéale : Je me demandais comment je pourrais intégrer cela dans ma propre mise en œuvre d'une fonction d'éditeur pour obtenir quelque chose comme ceci :
cancellable = stringFuture.receive(on: RunLoop.main, inMode: RunLoop.Mode.common)
.sink { string in
cell.textLabel.text = string
}
L'API de cette fonction pourrait être quelque chose comme ceci :
extension Publisher {
public func receive(on runLoop: RunLoop, inMode: RunLoop.Mode) -> AnyPublisher<Future.Output, Future.Failure> {
// How to implement this?
}
}