2012-11-13 15 views
6

Sono molto nuovo a Xcode e Objective-C, quindi non so davvero cosa sto facendo ancora! ;-)
Fondamentalmente voglio avere un'applicazione IPhone in grado di eseguire probabilmente due thread, che utilizzeranno in seguito UDP Sockets per comunicare con altre app.Creare due thread in Objective-C

Ho messo le funzioni per reagire quando si preme il pulsante start-Thread/stop-Thread nell'interfaccia utente, ora voglio riempirle con il codice per creare e avviare effettivamente i thread.

  • Quale sarebbe la procedura corretta qui?
  • Devo creare una sottoclasse NSThread?
  • Dove posso implementare il codice, che i nuovi thread verranno eseguiti?

    Non riesco a vedere un metodo di esecuzione o qualcosa di simile. Suppongo che abbia qualcosa a che fare con lo selector, che non capisco.

+0

Leggere la [Guida programmazione threading] (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html) e il [riferimento NSThread] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html). Se si sottoclasse 'NSThread', si sovrascriverà in genere il metodo' main'. – omz

+5

Ti suggerisco di utilizzare [dispatch code] (http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102 -SW24) invece. – Kevin

+0

I seconde code di invio. – Wevah

risposta

14

Utilizzare dispatch queues. Sono essenzialmente thread leggeri per i quali non è necessario preoccuparsi direttamente del threading o dell'accodamento.

-(void) spawn 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     [self doWorkInBackground]; 
    }); 
} 

È possibile utilizzare una delle code incorporate o le proprie.

E probabilmente dovresti leggere anche su blocks, in particolare l'aspetto di gestione della memoria.

+0

ciao grazie per la risposta, ho iniziato a leggere la guida. Tuttavia, per quanto ho capito ora, possiamo avere code seriali o simultanee. In quelli seriali, viene eseguita una sola attività in qualsiasi momento, il che non è sufficiente per me, poiché potrebbero esserci due attività contemporaneamente. Quindi avrei bisogno di una coda concorrente, tuttavia il sistema gestisce quante attività vengono eseguite parallelamente. Ho comunque bisogno di eseguire esattamente le due attività, quando l'utente le richiede. In generale comunque avrei bisogno di creare 2 blocchi o funzioni ciascuno eseguendo un "thread" e metterli in coda? – user1809923

+0

Poiché i blocchi sono scritti in linea con il resto del codice e avrei bisogno di avere un blocco per ogni thread e i thread non sono troppo brevi, mi chiedo se questa sia davvero la strada giusta da percorrere, considerando la panoramica del codice. – user1809923

+0

È possibile dichiarare i blocchi fuori linea con precisione –

1
- (void)performBlockInBackground:(void (^)())block { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     block(); 
    }); 
} 

Poi si chiamano in questo modo:

[self performBlockInBackground:^{ 
    NSLog(@"Log from background"); 
}]; 
+0

Questo metodo si blocca se non si controlla se il blocco non è NULL. – danielbeard

+0

@danielbeard Sì, certo, ma perché mai chiameresti '[self performBlockInBackground: NULL];'? – NSAddict

+0

Se il blocco è memorizzato su un oggetto diverso ed è deallocato, il blocco sarà NULL. Per esempio. 'someObject.actionBlock' – danielbeard

1

Si può anche considerare l'utilizzo di NSOperation. Utilizza le code di invio sotto il cofano, ma offre API di livello superiore e possibilità di annullare l'operazione in corso (che potrebbe essere utile per te).

Problemi correlati