Recherche…


Créer un fil simple

Le moyen le plus simple de créer un thread est d'appeler un sélecteur "en arrière-plan". Cela signifie qu'un nouveau thread est créé pour exécuter le sélecteur. L'objet récepteur peut être n'importe quel objet, pas seulement self , mais il doit répondre au sélecteur donné.

- (void)createThread {
    [self performSelectorInBackground:@selector(threadMainWithOptionalArgument:)
                           withObject:someObject];
}

- (void)threadMainWithOptionalArgument:(id)argument {
    // To avoid memory leaks, the first thing a thread method needs to do is
    // create a new autorelease pool, either manually or via "@autoreleasepool".
    @autoreleasepool {
        // The thread code should be here.
    }
}

Créer des threads plus complexes

L'utilisation d'une sous-classe de NSThread permet la mise en œuvre de threads plus complexes (par exemple, pour permettre de transmettre plus d'arguments ou d'encapsuler toutes les méthodes d'assistance associées dans une classe). En outre, l'instance NSThread peut être enregistrée dans une propriété ou une variable et peut être interrogée sur son état actuel (qu'il soit toujours en cours d'exécution).

La classe NSThread prend en charge une méthode appelée cancel qui peut être appelée à partir de n'importe quel thread, qui définit ensuite la propriété cancelled sur YES de manière sûre. L'implémentation du thread peut interroger (et / ou observer) la propriété cancelled et quitter sa méthode main . Cela peut être utilisé pour arrêter normalement un thread de travail.

// Create a new NSThread subclass
@interface MyThread : NSThread

// Add properties for values that need to be passed from the caller to the new
// thread. Caller must not modify these once the thread is started to avoid
// threading issues (or the properties must be made thread-safe using locks).
@property NSInteger someProperty;

@end

@implementation MyThread

- (void)main
{
    @autoreleasepool {
        // The main thread method goes here
        NSLog(@"New thread. Some property: %ld", (long)self.someProperty);
    }
}

@end


MyThread *thread = [[MyThread alloc] init];
thread.someProperty = 42;
[thread start];

Stockage local

Chaque thread a accès à un dictionnaire mutable local au thread actuel. Cela permet de mettre en cache les informations de manière simple sans avoir besoin de les verrouiller, car chaque thread a son propre dictionnaire de mutabilité dédié:

NSMutableDictionary *localStorage = [NSThread currentThread].threadDictionary;
localStorage[someKey] = someValue;

Le dictionnaire est automatiquement libéré à la fin du thread.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow