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? :)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top