web-dev-qa-db-fra.com

- [UIApplication delegate] doit être appelé à partir du thread principal uniquement.

Cet avertissement pose un grave problème car je ne peux vraiment pas appeler le délégué en dehors du thread principal à l'aide de Xcode 9 beta 2. Chose étrange, cela fonctionnait lorsque j'utilisais Xcode 8.3.3.

De plus, je pensais que ce ne serait qu'une bonne pratique d'appeler les délégués depuis le fil principal uniquement, n'est-ce pas? Alors, pourquoi cela provoque-t-il le blocage de l'application maintenant?

33
renraku

Appelez-le simplement du fil principal comme ceci.

dispatch_async(dispatch_get_main_queue(), ^{
  [[UIApplication delegate] fooBar];
});

Tendre la main au délégué de votre application de cette manière est un indice que votre architecture pourrait nécessiter un peu de nettoyage.

Vous pouvez appeler des délégués à partir de n’importe quel fil de discussion. Vous devez seulement vous assurer que vous êtes sur le fil principal des appels UIKit. Ou que vous êtes sur le bon thread auquel s'attendent vos objets CoreData. Tout dépend du contrat API que vos objets ont.

54
orkoden

Dans Swift, vous pouvez aussi utiliser DispatchQueue.main.async appeler la méthode de contrôle de l'interface utilisateur à partir du thread principal

DispatchQueue.main.async {
    YourUIControlMethod()
}
19
Allen