[SWIFT] Je souhaite également utiliser Combine dans UIKit.

introduction

Avec la sortie d'iOS14, Swft lui-même a été mis à jour et l'interface utilisateur de Swift a été normalisée ces jours-ci. Je pense que beaucoup de gens ne peuvent pas couper iOS12 et ne peuvent pas utiliser Combine dans la pratique.

Mais j'aimerais essayer une nouvelle technologie. SwiftUI + Combine est un obstacle un peu élevé, mais avant tout, j'aimerais essayer Combine seul avec le UIKit familier! !!

Donc, cette fois, j'ai écrit un article avec le contenu suivant.

J'espère que tu trouves cela utile. : arc:

environnement

Cet article a été confirmé pour fonctionner dans les environnements d'exploitation suivants.

Qu'est-ce que Combine?

En un mot, c'est «le véritable framework asynchrone d'Apple». Je vais citer l'explication d'Apple Developer.

The Combine framework provides a declarative Swift API for processing values over time.

Cela signifie quelque chose comme "Le framework Combine fournit une API déclarative pour le traitement des valeurs au fil du temps."

C'est la fonction principale de Combine, et cela semble être la nature du framework asynchrone.

Connaître les personnages de Combine

Avant d'essayer d'utiliser Combine, je vais vous présenter le flux global et les caractères que vous devez connaître pour utiliser Combine.

Personnage

Cela ressemble à ceci sur la figure.

Untitled Diagram.png

En programmation Rx et réactive, le concept ci-dessus est souvent exprimé par un diagramme en marbre, Personnellement, il est plus facile de penser au concept de la figure qui montre les caractères de 1-1-1 comme indiqué dans la figure ci-dessus.

Touchons-le pour le moment

Maintenant que vous connaissez les personnages, touchons-les pour le moment.

C'est l'écran de connexion que vous voyez souvent. Si vous concevez avec MVVM, vous devez lier l'adresse e-mail reçue de TextField dans View à ViewModel. Prenons l'implémentation à ce moment-là comme exemple pour voir l'explication et l'exemple d'implémentation de Publisher, Operator et Subscriber.

Publisher Le premier est Publisher. https://developer.apple.com/documentation/combine/publisher

Publisher est une personne formidable qui peut publier des valeurs, vous pouvez donc publier l'adresse e-mail que vous avez reçue dans View.

Tout d'abord, créons un éditeur qui publie une valeur lorsque le texte du TextField change.

import Combine

final class LoginViewController: UIViewController {

    @IBOutlet weak var mailAddressTextField: UITextField!

    private let viewModel = LoginViewModel()
    private var binding = Set<AnyCancellable>()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //Lorsque textDidChangeNotification est notifié`mailAddressTextField`Émettez l'objet.
        NotificationCenter.default
            .publisher(for: UITextField.textDidChangeNotification, object: mailAddressTextField)

    }
}

N'oubliez pas d'importer. Désormais, lorsque le champ textField change, un objet appelé «mailAddressTextField» sera émis.

Untitled Diagram (1).png

Operator Ensuite, passons à Operator. L'opérateur est un type formidable qui peut convertir des valeurs, vous pouvez donc également convertir l'objet UITextField publié par Publisher ci-dessus. Lors de la liaison à un ViewModel avec une valeur TextField, une seule chaîne suffit à passer au ViewModel. Utilisons donc Operator pour convertir UITextField en String.

import Combine

final class LoginViewController: UIViewController {

    @IBOutlet weak var mailAddressTextField: UITextField!

    private let viewModel = LoginViewModel()
    private var binding = Set<AnyCancellable>()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        NotificationCenter.default
            .publisher(for: UITextField.textDidChangeNotification, object: mailAddressTextField)
            .compactMap { $0.object as? UITextField } //Si vous ne parvenez pas à lancer UITextField et qu'il devient nul, jouez-le
            .map { $0.text ?? "" } //Extraire le texte de UITextField et le convertir en String
    }
}

Je fais ça.

Untitled Diagram (2).png

De cette manière, lorsque la valeur émise par Publisher et la valeur que vous souhaitez recevoir sont différentes, l'opérateur gère la conversion et la gestion de la valeur au milieu. Voir ci-dessous pour les types d'opérateurs.

Subscriber Le dernier est Sbscriber. Étant donné que Sbscriber est un type formidable qui peut recevoir des valeurs et faire diverses choses, vous pouvez définir la chaîne de l'adresse e-mail envoyée de Publisher à ViewModel.

import Combine

final class LoginViewController: UIViewController {

    @IBOutlet weak var mailAddressTextField: UITextField!
    
    private let viewModel = LoginViewModel()
    private var binding = Set<AnyCancellable>()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        NotificationCenter.default
            .publisher(for: UITextField.textDidChangeNotification, object: mailAddressTextField)
            .compactMap { $0.object as? UITextField }
            .map { $0.text ?? "" }
            .removeDuplicates() //Éliminez les valeurs en double
            .eraseToAnyPublisher()
            .receive(on: RunLoop.main)
            .assign(to: \.mailAddress, on: viewModel) //viewModèle\.Attribuer une valeur à mailAddress
            .store(in: &binding)
    }
}

final class LoginViewModel {
    var mailAddress: String = "" {
        didSet {
            print(mailAddress)
        }
    }
}

On dirait que vous en faites beaucoup, mais il y a deux points.

La méthode assign se développe à partir de Publisher et peut générer un abonné tout en transmettant la valeur reçue à l'objet défini par keypath. Cependant, si elle est laissée telle quelle, la mémoire ne sera pas libérée, nous appelons donc .store (in: & binding) pour annuler la surveillance.

Untitled Diagram (3).png

Courir

Avec le code jusqu'à présent, lorsque vous recevez la valeur de TextField, elle sera définie dans ViewModel!

Sommaire

Combine est le véritable framework asynchrone d'Apple et possède les fonctionnalités suivantes.

Combine a les caractères principaux suivants:

prime

Afin de m'habituer à Combine, je crée également une application qui gère les livres en appuyant sur API avec UIKit et Combine. Je prévois d'inclure un client API qui incorpore Combine, un éditeur qui a été transformé en extension pour le rendre plus facile à utiliser, etc.

kawano108/CombineBookManagerApp

Recommended Posts

Je souhaite également utiliser Combine dans UIKit.
Je veux utiliser @Autowired dans Servlet
Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin
Je veux aussi utiliser des coquillages à Laradock! !!
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Je veux utiliser une petite icône dans Rails
Je souhaite utiliser DBViewer avec Eclipse 2018-12! !!
Je veux obtenir des propriétés sous forme de chaînes JSON dans Jackson!
[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe
Je souhaite envoyer un e-mail en Java.
Je veux utiliser java8 forEach avec index
Je souhaite transmettre APP_HOME pour me connecter à Gradle
rsync4j --Je veux toucher rsync en Java.
Je veux être finalement même à kotlin
Je veux obtenir la valeur en Ruby
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
Je veux faire quelque chose comme "cls" en Java
Je veux utiliser NetBeans sur Mac → Je peux l'utiliser!
Je veux intégrer n'importe quel TraceId dans le journal
Je souhaite définir une fonction dans la console Rails
[Android Studio] Je souhaite utiliser une bibliothèque Maven sur Android
Je veux arrêter les cas de serpent avec des définitions de table
Je veux cliquer sur une broche GoogleMap dans RSpec
Je souhaite utiliser PowerMock dans une classe qui combine des tests paramétrés et des tests ordinaires
Je veux convertir des caractères ...
[Débutant] Je souhaite modifier le fichier de migration-Comment utiliser la restauration-
Je veux trouver un chemin relatif dans une situation où Path est utilisé
Je souhaite effectuer une factorisation prime rapide avec Ruby (ABC177E)
[jackson] Je souhaite recevoir les valeurs JSON "0" et "1" sous forme de booléen
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Je souhaite utiliser la méthode de désinfection autre que View.
Comment utiliser ArgumentMatchers tels que Mockito's any () dans Kotlin
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Je veux créer un fichier Parquet même en Ruby
Je souhaite passer au même écran dans l'état enregistré
Je souhaite utiliser FireBase pour afficher une chronologie comme Twitter
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Comment utiliser Lombok au printemps
Je souhaite utiliser le balayage arrière sur un écran qui utilise XLPagerTabStrip
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
Comment utiliser InjectorHolder dans OpenAM
Je veux ajouter un appareil dans Rails, mais je ne peux pas grouper l'installation
Comment utiliser les classes en Java?
Je veux supprimer la marge supérieure dans UITableView de Grouped (swift)
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Je veux changer la valeur de l'attribut dans Selenium of Ruby
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
[Rails] Je souhaite envoyer des données de différents modèles dans un formulaire
Je veux écrire une JSP dans Emacs plus facilement que la valeur par défaut.
Je souhaite sélectionner plusieurs éléments avec une disposition personnalisée dans la boîte de dialogue