5 votes

Existe-t-il un moyen de spécifier la boucle et le mode d'exécution pour recevoir des éléments d'un éditeur ?

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?

    }
}

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