2013-03-18 3 views
-5

Je voudrais géolocaliser en arrière-plan avec un thred! Mais je ne peux pas, j'ai essayé scheduler, thred, opération ect ect ... mais tout ce que je bloque la progression de la barre de progression.Géolocalisation asynchrone iOS

+0

Les méthodes CLGeocoder sont déjà asynchrones et s'exécutent en arrière-plan. –

+0

Voulez-vous dire que vous voulez trouver l'emplacement des appareils? c'est-à-dire lat et long? Ou voulez-vous trouver le nom de l'endroit où se trouve l'appareil? – Fogmeister

+0

... et parce que lorsque je lancedatelocation la barre de progression arrête d'attendre d'avoir terminé l'emplacement et de continuer ensuite vers l'avant? – mikejobs

Répondre

2

J'utilise un objet singleton pour l'emplacement comme celui-ci ...

@implementation LocationManager 

#pragma mark - singleton method 

+ (LocationManager*)sharedInstance 
{ 
    static dispatch_once_t predicate = 0; 
    __strong static id sharedObject = nil; 
    dispatch_once(&predicate, ^{ 
     sharedObject = [[self alloc] init]; 
    }); 
    return sharedObject; 
} 

#pragma mark - instance methods 

-(id) init { 
    if (self = [super init]) { 
     _currentLocation = [[CLLocation alloc] init]; 
     _locationManager = [[CLLocationManager alloc] init]; 
     _locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
     _locationManager.delegate = self; 
    } 
    return self; 
} 

- (void)start 
{ 
    [self.locationManager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    //if the time interval returned from core location is more than two minutes we ignore it because it might be from an old session 
    if (abs((int) [newLocation.timestamp timeIntervalSinceDate: [NSDate date]]) < 120) { 
     self.currentLocation = newLocation; 
    } 
} 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 
// [[[UIAlertView alloc] initWithTitle:@"Error" message:[error description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; 
} 

@end 

Alors je dois juste appeler ...

[[LocationManager sharedInstance] start]; 

et le singleton Point de départ suivi.

Que je l'appelle ...

[[LocationManager sharedInstance] currentLocation]; 

pour l'emplacement actuel.

Vous pouvez ensuite utiliser ceci pour passer aux méthodes déjà asynchrones de CLGeocoder.

Vous ne pouvez pas compter sur le démarrage du suivi de l'emplacement, puis sur l'emplacement immédiat. Vous devez utiliser une méthode comme celle-ci.

0

CLGeocoder fonctionne en arrière-plan.