87 votes

Appeler une méthode sur le thread principal ?

Tout d'abord, j'écris du code pour iphone. Je dois pouvoir appeler une méthode sur le thread principal sans utiliser performSelectorOnMainThread . La raison pour laquelle je ne veux pas utiliser performSelectorOnMainThread est que cela pose problème lorsque j'essaie de créer une maquette pour les tests unitaires.

 [self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];

Le problème est que ma maquette sait comment appeler doSomething mais elle ne sait pas comment appeler performSelectorOnMainThread .

Alors une solution ?

281voto

aryaxt Points 15011

Objectif c

 dispatch_async(dispatch_get_main_queue(), ^{
    [self doSomething];
});

Rapide

 DispatchQueue.main.async {
    self.doSomething()
}

Héritage Swift

 dispatch_async(dispatch_get_main_queue()) {
    self.doSomething()
}

2voto

hotpaw2 Points 40796

Il existe un dicton dans les logiciels selon lequel l'ajout d'une couche d'indirection résoudra presque tout.

Faites en sorte que la méthode doSomething soit un shell d'indirection qui n'exécute qu'un performSelectorOnMainThread pour appeler la méthode really_doSomething pour effectuer le travail réel de Something. Ou, si vous ne souhaitez pas modifier votre méthode doSomething, demandez à l'unité de test fictif d'appeler une méthode doSomething_redirect_shell pour faire quelque chose de similaire.

1voto

Esq Points 498

Voici une meilleure façon de le faire dans Swift :

 runThisInMainThread { () -> Void in
    // Run your code
    self.doSomething()
}

func runThisInMainThread(block: dispatch_block_t) {
    dispatch_async(dispatch_get_main_queue(), block)
}

Il est inclus en tant que fonction standard dans mon référentiel, consultez-le : https://github.com/goktugyil/EZSwiftExtensions

1voto

RomOne Points 1478

Et maintenant dans Swift 3 :

 DispatchQueue.main.async{
   self.doSomething()
}

-4voto

// Draw Line
    func drawPath(from polyStr: String){
        DispatchQueue.main.async {
            let path = GMSPath(fromEncodedPath: polyStr)
            let polyline = GMSPolyline(path: path)
            polyline.strokeWidth = 3.0
            polyline.strokeColor = #colorLiteral(red: 0.05098039216, green: 0.5764705882, blue: 0.2784313725, alpha: 1)
            polyline.map = self.mapVu // Google MapView
        }

    }

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