web-dev-qa-db-fra.com

dispatch_async et bloquer dans iOS

Que signifie ce morceau de code?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        TMBaseParser *parser=[[TMBaseParser alloc] init];
        parser.delegate=self;
        NSString *post =nil;
        NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
        [parser parseForServiceType:TMServiceCategories postdata:postData];
    });

veuillez l'expliquer brièvement.

33

Le morceau de code

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

});

est exécuté de manière asynchrone sur un thread d'arrière-plan. Cela est dû au fait que l'analyse des données peut prendre du temps et bloquer le thread principal, ce qui arrêterait toutes les animations et l'application ne serait pas réactive.

Si vous souhaitez en savoir plus, lisez la documentation d'Apple sur Grand Central Dispatch et Dispatch Queue .

101
Marcin Kuptel

Si les extraits de code ci-dessus ne fonctionnent pas, essayez ceci:

Objectif-C:

dispatch_async(dispatch_get_main_queue(), ^{

});

Les mises à jour de l'interface utilisateur doivent toujours être exécutées à partir de la file d'attente principale. Le symbole "^" indique le début d'un bloc.

Swift 3:

DispatchQueue.global(qos: .background).async {
    print("This is run on the background queue")

    DispatchQueue.main.async {
        print("This is run on the main queue, after the previous code in outer block")
    }
}
6
Md Rais

Il s'agit d'un bloc Grand Central Dispatch.

  1. dispatch_async est un appel à exécuter sur une autre file d'attente.
  2. dispatch_get_global_queue est un appel pour obtenir une file d'attente spécifique avec les caractéristiques souhaitées. Par exemple, le code pourrait être exécuté avec une faible priorité sur le DISPATCH_QUEUE_PRIORITY_BACKGORUND.
  3. À l'intérieur du bloc, le code ne fait rien. Le message est défini sur zéro. Ensuite, un message est envoyé à "dataUsingEncoding". Objective C abandonne tous les appels à nil. Enfin, l'analyseur est envoyé "nil" postData.
  4. Au mieux, cela ne fera rien. Au pire, l'envoi des données nulles de l'analyseur se bloquera.
2
rismay