iphone ios in esecuzione in thread separati


96

Qual è il modo migliore per eseguire il codice su un thread separato? È:

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

O:

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

Ho fatto il secondo modo, ma il libro di cucina di Wesley che ho letto usa il primo.

Risposte:


243

A mio parere, il modo migliore è con libdispatch, noto anche come Grand Central Dispatch (GCD). Ti limita a iOS 4 e versioni successive, ma è così semplice e facile da usare. Il codice per eseguire alcune elaborazioni su un thread in background e quindi fare qualcosa con i risultati nel ciclo di esecuzione principale è incredibilmente facile e compatto:

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
    });
});

Se non l'hai già fatto, guarda i video di WWDC 2010 su libdispatch / GCD / blocks.


Ho bisogno che sia compatibile con 3.0 :(
Mike S

1
Quindi le code delle operazioni sono probabilmente la prossima soluzione migliore. Inoltre, assicurati di non immergerti troppo rapidamente nella concorrenza. Prova a iniziare scrivendo cose a thread singolo e profilo per vedere se è necessario passare al multithreading o se puoi progettare il tuo codice a thread singolo per essere più efficiente da solo. Per attività semplici, a volte puoi fare tutto ciò di cui hai bisogno con performSelector: withObject: afterDelay: ed evitare tutti i problemi che derivano dalla programmazione multi-thread.
Jacques

Ci scusiamo per averlo resuscitato così tanto più tardi, ma se spawn una chiamata al metodo con performSelector: withObject: afterDelay devo ancora utilizzare un NSAutoReleasePool all'interno del metodo async? Se utilizza magicamente il pool di rilascio automatico principale, performSElector: afterDelay è sicuramente un'opzione più rapida.
Mike S

No, perché il metodo viene eseguito sul thread principale, che dispone del proprio pool di rilascio automatico.
Jacques

4
@ Joe. A rischio di dire qualcosa che già conosci, non dovresti prendere l'abitudine di scrivere codice che uccide i thread, non aiuterà te o la tua carriera a lungo termine. Vedi questo post (o molti simili) per i motivi per cui non uccidere i thread.
MikeC

1

Il modo migliore per il multithreading in iOS è utilizzare 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
    });
});

0

Proverei tutte le tecniche che le persone hanno pubblicato e vedrei qual è la più veloce, ma penso che questo sia il modo migliore per farlo.

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

questo avvia il thread con una priorità bassa. L'uso di gcd è il modo migliore per il threading.
Karsten

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.