strato di filo consiglia di utilizzare per lo sviluppo iPhone?
-
12-09-2019 - |
Domanda
Sono nuovo di Objective C, e lo sviluppo di Mac ... Sembra che posso usare il thread POSIX API nella mia app .. E 'questo il modo consigliato? O è la loro alcune API di Apple dovrei usare per i mutex, variabili di condizione e le discussioni, invece?
Vorrei aggiungere che sto sviluppando per l'iPhone.
Mi piacerebbe aggiungere esattamente quello che sto cercando di fare. In sostanza, CoreLocation è asincrona ... si dice di avviare l'aggiornamento voi, e poi appena chiama un metodo di aggiornamento su di voi periodicamente ...
Il problema che ho è che ho bisogno di un altro thread di bloccare fino a quando si verifica un aggiornamento ... Come posso fare il blocco filo principale finché non si verifica almeno un aggiornamento CoreLocation? È la loro una NSConditionVariable? :)
Soluzione
Invece di bloccare l'interfaccia utente rendendola appendere, vorrei suggerire che mostra una sorta di schermata di caricamento fino a quando hai ricevuto il tuo primo aggiornamento. Il poteva sarebbe simile a questa:
- (void)viewDidLoad {
...
[myCLLocationManager beginUpdates];
[self showLoadingIndicator];
....
}
- (void)locationManager:(CLLocationManager *)manager didReceiveUpdates {
[self hideLoadingIndicator];
// Additionally load the rest of your UI here, if you haven't already
}
Non citare me su quelle chiamate di metodo alla lettera, ma è così che vi suggerisco di risolvere il tuo problema, in sostanza.
Altri suggerimenti
Io suggerirei un modo ancora più facile rimanere bloccati in fili è quello di utilizzare la seguente chiamata:
[self performSelectorInBackground:(@selector(myMethod)) withObject:nil];
Questo creerà automaticamente un nuovo thread in background per voi per eseguire in proposito assicurarsi che il seguente all'interno del vostro metodo di sfondo:.
-(void) myMethod {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// code you want to run in background thread;
[pool drain];
}
Questo è necessario perché non c'è una piscina di default autorelease allestito per qualsiasi thread ad eccezione di quello principale.
Infine, parlando di bloccare il thread principale, è possibile utilizzare il seguente dal thread in background per fare questo:
[self performSelectorOnMainThread:(@selector(myOtherMethod)) withObject:nil waitUntilDone:YES];
Il terzo parametro opzionale terrà il filo principale per voi, se si desidera farlo.
Speranza che aiuta!
Dipende da ciò che si sta cercando di fare, ma vorrei iniziare con NSOperation e NSOperationQueue. Lo rende abbastanza semplice a portata di mano fuori le operazioni in background. Date un'occhiata al post sul blog di Dave Dribin su NSOperation concorrenza così: http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/
Sì, c'è un oggetto NSCondition, e probabilmente fare esattamente quello che vuoi per lo scenario CoreLocation lei ha citato.