Domanda

Sto cercando di inoltrare Geocode un indirizzo in iOS 5 usando l'oggetto Clgeocoder e inserire la cllocazione risultante in una variabile di istanza. Per qualche motivo, posso impostare la variabile di istanza e quindi chiamare il suo getter, ma la variabile perde il suo valore al di fuori dell'ambito del gestore di completamento del geocoder.

Ho dichiarato la variabile nel mio file .h:

@property (nonatomic, strong) CLLocation *specifiedPosition;

Quindi lo ha sintetizzato nel mio .m:

@synthesize specifiedPosition = _specifiedPosition;

E poi ha provato a usare il geocoder in questo modo: il primo NSLog restituisce una latitudine e una longitudine, mentre il secondo no:

-(void)getLatLong:(NSString *)locationText
{

if (!self.geocoder)
{
    self.geocoder = [[CLGeocoder alloc] init];
}

[self.geocoder geocodeAddressString:locationText completionHandler:^(NSArray *placemarks, NSError *error){

    if ( ([placemarks count] > 0) && (error == nil)) {

        self.specifiedPosition = [[placemarks objectAtIndex:0] location];
        NSLog(@"Specified Location variable is set to: %@", self.specifiedPosition);


    } else if (error == nil && [placemarks count] == 0){
        // TODO
        NSLog(@"Can't find data on the specificed location");
    }
    else if (error != nil){
        // TODO
        NSLog(@"An error occurred = %@", error);
    }

}];

NSLog(@"Specified Location variable is set to: %@", self.specifiedPosition);

}

Ho anche provato un setter personalizzato, ma questo non ha aiutato:

-(void)setSpecifiedPosition:(CLLocation *)specifiedPosition
{
    _specifiedPosition = specifiedPosition;
}

Grazie in anticipo per il vostro aiuto!

È stato utile?

Soluzione

Non ho familiarità con questa particolare API, ma il fatto che stia prendendo un blocco chiamato completionHandler suggerisce molto fortemente che questo è un asincrono operazione. Cioè, il tuo blocco verrà invocato dopo (dal ciclo di corsa). Il tuo secondo NSLog Nel codice sorgente sta accadendo prima il completionHandler è invocato, quindi ovviamente non vede l'incarico poiché non è ancora successo.

Qualunque cosa tu debba fare una volta che hai i dati specifici, dovresti farlo all'interno del completionHandler blocco, all'interno di -setSpecifiedPosition:, o da qualche altra parte che viene notificato/attivato/chiamato da uno di questi.

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