web-dev-qa-db-fra.com

iphone ios fonctionnant dans un fil séparé

Quel est le meilleur moyen d'exécuter du code sur un thread séparé? Est-ce:

[NSThread detachNewThreadSelector: @selector(doStuff) toTarget:self withObject:NULL];

Ou:

    NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                        selector:@selector(doStuff:)
                                                                          object:nil;
[queue addOperation:operation];
[operation release];
[queue release];

Je fais la deuxième façon mais le livre de recettes Wesley que j'ai lu utilise la première.

95
Mike S

À mon avis, le meilleur moyen est d'utiliser libdispatch, alias Grand Central Dispatch (GCD). Cela vous limite à iOS 4 et supérieur, mais c'est tellement simple et facile à utiliser. Le code permettant d'effectuer un traitement sur un thread en arrière-plan, puis de modifier les résultats dans la boucle d'exécution principale est incroyablement simple et compact:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Add code here to do background processing
    //
    //
    dispatch_async( dispatch_get_main_queue(), ^{
        // Add code here to update the UI/send notifications based on the
        // results of the background processing
    });
});

Si vous ne l'avez pas déjà fait, consultez les vidéos de WWDC 2010 sur libdispatch/GCD/blocks.

242
Jacques

Le meilleur moyen de multithreading dans iOS consiste à utiliser GCD (Grand Central Dispatch).

//creates a queue.

dispatch_queue_t myQueue = dispatch_queue_create("unique_queue_name", NULL);

dispatch_async(myQueue, ^{
    //stuffs to do in background thread
    dispatch_async(dispatch_get_main_queue(), ^{
    //stuffs to do in foreground thread, mostly UI updates
    });
});
1
Kusal Shrestha

Je voudrais essayer toutes les techniques que les gens ont postées et voir laquelle est la plus rapide, mais je pense que c'est la meilleure façon de le faire.

[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];
0
Bobby

J'ai ajouté une catégorie sur NSThread qui vous permettra d'exécuter facilement des threads dans des blocs. Vous pouvez copier le code à partir d'ici.

https://medium.com/@umairhassanbaig/ios-how-to-perform-a-background-thread-and-main-thread-with-ease-11f5138ba38

0
Umair