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
Respuesta
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.
thks, pero el valor cllocation consta de 2 valores dobles para latitud larga, ¿cómo puedo codificarlo,. – devonsmith
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
necesito codificarlo cuando lo guardo en una matriz y luego en nsuserdefaults ... – devonsmith
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"];
}
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.) –
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?
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. –
Este es el método habitual.
CLLocation *myLocationToStore = ...; // (a CLLocation object)
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore];
- 1. CLLocationCoordinate2D a CLLocation
- 2. CLLocation pida nuevamente permiso
- 3. Diferentes binarios con "Archivar" y "Crear para archivar" en Xcode4
- 4. Archivar grandes cantidades de datos antiguos en SQL Server
- 5. CLLocation que devuelve la velocidad negativa
- 6. ¿Cuán precisa es la precisión de CLLocation?
- 7. ¿Cómo almacenar CLLocation usando Core Data (iPhone)?
- 8. Orden de los objetos CLLocation en -distanceFromLocation:
- 9. No se puede crear el objeto CLLocation
- 10. Archivar los artefactos en Jenkins
- 11. ¿Cuál es la mejor forma de archivar datos en una base de datos Oracle?
- 12. Necesito analizar datos xml no formados (HTML)
- 13. ¿Cómo puedo archivar una rama arbitraria?
- 14. ¿Cómo construir y archivar la aplicación iOS?
- 15. No se puede archivar la aplicación
- 16. El problema con el método CLLocation distanceFromLocation: Los resultados inexactos
- 17. utilizando objetos CLLocation como claves en el diccionario de
- 18. Creación de archivos GPX desde una matriz de CLLocation
- 19. CLLocation - Encontrar declinación/desviación magnética en otra ubicación
- 20. La mejor manera de archivar la base de datos MySQL en vivo
- 21. ¿Grabar video en tiempo real HTTP para archivar mientras mira?
- 22. ¿Necesito un índice espacial en mi base de datos?
- 23. Necesito ayuda para formatear un enlace de datos usando Knockout
- 24. Necesito una opción TCP (ioctl) para enviar datos inmediatamente
- 25. Enlace de datos en la imagen pero necesito un byteArray
- 26. Necesito ayuda para trabajar con bases de datos en C#
- 27. asp.net mvc - necesito almacenar algunos datos para la solicitud actual
- 28. necesito encontrar datos enteros en la lista de arrays?
- 29. ¿Necesito normalizar (o escalar) datos para randomForest (paquete R)?
- 30. Imprimir texto Archivar en una impresora específica en java
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