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:
Cet article a été confirmé pour fonctionner dans les environnements d'exploitation suivants.
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.
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.
Cela ressemble à ceci sur la figure.
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.
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.
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
}
}
.compactMap
..map
et convertissez-le en String.Je fais ça.
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.
.assign (to: \ .mailAddress, on: viewModel)
est définie dans ViewModel..store (in: & binding)
.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.
Avec le code jusqu'à présent, lorsque vous recevez la valeur de TextField, elle sera définie dans ViewModel!
Combine est le véritable framework asynchrone d'Apple et possède les fonctionnalités suivantes.
Combine a les caractères principaux suivants:
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