2011-03-10 10 views
5

Tengo una matriz de CLLocation datos que me gustaría archivar. ¿Debería usarse el sistema NSUserDefaults? De lo contrario, ¿cuál es la mejor manera de archivar los datos CLLocation?Necesito archivar CLLocation datos

+0

Si se utiliza la base de datos, ver este post ayuda: http://stackoverflow.com/questions/3797128/how-to-store-cllocation-using-core-data-iphone – petert

Respuesta

3

UserDefaults solo puede almacenar ciertos tipos de datos, y debe usarse para almacenar información de preferencias del usuario, no datos de estado de aplicaciones arbitrarias.

citar el Apple docs:

La clase NSUserDefaults proporciona una interfaz de programación para interactuar con el sistema por defecto. El sistema predeterminado permite que una aplicación a personalice su comportamiento para que coincida con las preferencias del usuario . Por ejemplo, puede permitir a los usuarios determinar qué unidades de medida muestra su aplicación o con qué frecuencia se guardan automáticamente los documentos .

Más información here.

Si sus datos de CLLocation realmente cuentan como información de preferencia del usuario (que no me convencen), tendrá que asignar la información dentro de CLLocation en tipos que sean compatibles con NSUserDefaults. Lee el docs for NSUserDefaults.

Si sus datos de CLLocation no son información de preferencias del usuario, sino solo datos/estado de la aplicación que necesita conservar, tiene algunas opciones; podría almacenarlo en datos básicos, o podría usar el archivado por clave; consulte this tutorial, por ejemplo.

+0

thks, pero el valor cllocation consta de 2 valores dobles para latitud larga, ¿cómo puedo codificarlo,. – devonsmith

+0

Bueno, ¿dónde pretendes codificarlo? Por favor, acepte algunas de las muchas respuestas que la gente le ha dado y le escribiré más tarde. – occulus

+0

necesito codificarlo cuando lo guardo en una matriz y luego en nsuserdefaults ... – devonsmith

1

Encontré la solución usando nsarchiver como dijiste que funcionó como un encanto gracias. Aquí esta lo que hice.

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 

    self.PlaceName=[aDecoder decodeObjectForKey:@"inapPlaceName"]; 

    float lat, long1; 

    lat=[aDecoder decodeDoubleForKey:@"inapCoordinateLat"]; 

    long1=[aDecoder decodeDoubleForKey:@"inapCoordinateLong"]; 

    //inapCoordinate=[[CLLocationCoordinate2D alloc] initWithLatitude:lat1 longitude:long1]; 
    CLLocationCoordinate2D new_coordinate = { lat, long1 }; 
    self.inapCoordinate=new_coordinate; 

    return self; 

} 

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 

    [aCoder encodeObject:PlaceName forKey:@"inapPlaceName"]; 

    [aCoder encodeDouble:inapCoordinate.latitude forKey:@"inapCoordinateLat"]; 

    [aCoder encodeDouble:inapCoordinate.longitude forKey:@"inapCoordinateLong"]; 

} 
+1

Advertencia: este fragmento de código al decodificar pone lat y long en locales 'float', lo que arroja un montón de precisión.(Están codificados y decodificados correctamente, pero esto dará como resultado datos de ubicación incorrectos después de la decodificación.) –

14

Para almacenar correctamente un CLLocation sin pérdida de información, utilizar un NSKeyedArchiver así:

CLLocation *myLocationToStore = ...; // (a CLLocation object) 
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore]; 

Esto puede ser archivado en NSUserDefaults, y del mismo modo decodificado tan simple cuando se recuperan con NSKeyedUnarchiver :

CLLocation *myStoredLocation = (CLLocation *)[NSKeyedUnarchiver unarchiveObjectWithData:locationData]; 

El Swift equivalent functions son:

class func archivedDataWithRootObject(_ rootObject: AnyObject) -> NSData] 
class func unarchiveObjectWithData(_ data: NSData) -> AnyObject? 
+0

muchas gracias hombre! Obtenía un error "EXC_BAD_ACCESS code = 1" asociado a intentar enviar un mensaje a un objeto ya lanzado. En mi caso, estaba usando dataWithBytes: length: y getBytes: length: para almacenar/obtener un objeto CLLocation. Sospecho que el búfer: & LocationObject lo liberaba, que proporciona al método una dirección de memoria para el búfer, pero cuando los bytes de datos se copian en el búfer, el puntero de la ubicación de la memoria se convierte en un puntero que no es Core Foundation. –

1

Este es el método habitual.

CLLocation *myLocationToStore = ...; // (a CLLocation object) 
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore]; 
Cuestiones relacionadas