J'ai lu que l'interface utilisateur doit toujours être mise à jour sur le thread principal. Cependant, je suis un peu perdu lorsqu'il s'agit de la méthode à privilégier pour mettre en œuvre ces mises à jour.
J'ai plusieurs fonctions qui effectuent des contrôles conditionnels, puis le résultat est utilisé pour déterminer comment mettre à jour l'interface utilisateur. Ma question est la suivante : la fonction entière doit-elle être exécutée sur le thread principal ? Est-ce que seule l'interface utilisateur doit être mise à jour ? Puis-je / dois-je exécuter les contrôles conditionnels sur un autre thread ? Cela dépend-il de ce que fait la fonction ou de la vitesse à laquelle elle doit être exécutée ?
Exemple d'une fonction qui change l'image à l'intérieur d'un ImageView sans threading :
@IBAction func undoPressed(_ sender: Any) {
if !previousDrawings.isEmpty {
previousDrawings.remove(at: previousDrawings.count - 1)
if let lastDrawing = previousDrawings.last {
topImageView.image = lastDrawing
}
else {
// empty
topImageView.image = nil
}
}
}
Devrais-je mettre topImageView.image
sur le fil principal ? Comme ceci :
@IBAction func undoPressed(_ sender: Any) {
if !previousDrawings.isEmpty {
previousDrawings.remove(at: previousDrawings.count - 1)
if let lastDrawing = previousDrawings.last {
DispatchQueue.main.async {
self.topImageView.image = lastDrawing
}
}
else {
DispatchQueue.main.async {
self.topImageView.image = nil
}
}
}
}
Devrais-je utiliser un fil de fond pour les contrôles conditionnels ? Comme ceci :
@IBAction func undoPressed(_ sender: Any) {
DispatchQueue.global(qos: .utility).async {
if !previousDrawings.isEmpty {
previousDrawings.remove(at: previousDrawings.count - 1)
if let lastDrawing = previousDrawings.last {
DispatchQueue.main.async {
self.topImageView.image = lastDrawing
}
}
else {
DispatchQueue.main.async {
self.topImageView.image = nil
}
}
}
}
}
Si quelqu'un pouvait expliquer quelle méthode est préférée et pourquoi, ce serait vraiment utile.