我希望在应用启动之间保留2个CLLocations。这是我希望在启动之间存储在内存中的唯一数据。我该怎么做呢? CLLocation是否具有writetofile或将其存储在coredata或NSUserDefaults中?我想存储整个CLLocation对象,不想只存储lat / lon然后做更多的计算等等。谢谢
答案 0 :(得分:7)
查看文档,我看到CLLocation
实现了NSCoding
协议。
这意味着您可以使用CLLocation
和NSKeyedArchiver
类归档和取消归档 NSKeyedUnarchiver
个实例。
您还可以将CLLocation
的多个实例放在任何实现NSCoder
的容器(父)类中,例如NSDictionary
或NSArray
,然后归档或取消归档整个对象集合。
有关详细信息,请参阅Archives and Serializations Programming Guide。如果您遇到问题,请使用代码发布后续问题。
答案 1 :(得分:1)
St3fan的答案就是我的价值所在并且工作得很好。简单解决一个简单的问题!我以为我会分享我想出的代码。
我有一个包含我的CLLocationManager
的Singleton类,这个类处理持久性并将CLLocationManagerDelegate
方法转发给一个委托数组,以防多个类对这些消息感兴趣(这一直是我的应用程序的情况。)
此代码可能无法用作复制/粘贴作业,但如果您无法从中找出所需内容,请查看单例模式并了解它! _lastLocation
是一个具有readonly属性的ivar,供其他类阅读。 persistLastLocation
执行保存位置的工作。你得到一个新的位置时应该打电话给它。
//////////////////////////////////////////////////////////////////////////////////////////////////// - (id)init { self = [super init]; if (self) { self.myLocationManager = [[CLLocationManager alloc] init]; self.myLocationManager.delegate = self; // Some config self.myLocationManager.desiredAccuracy = 482; // .3 miles self.myLocationManager.distanceFilter = 200; NSLog(@"CLLocationManager authStatus on start up: %d", [CLLocationManager authorizationStatus]); NSLog(@"Location services enabled: %d", [CLLocationManager locationServicesEnabled]); CLLocation *decodedLocation = [NSKeyedUnarchiver unarchiveObjectWithFile:[self lastLocationPersistenceFilePath]]; if (decodedLocation) { NSLog(@"Decoded location: %@", decodedLocation); _lastLocation = decodedLocation; } } return self; } #pragma mark - #pragma mark MyLocationManager //////////////////////////////////////////////////////////////////////////////////////////////////// - (NSString *)lastLocationPersistenceFilePath { NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"my_app_last_location"]; return filePath; } //////////////////////////////////////////////////////////////////////////////////////////////////// - (void)persistLastLocation { BOOL success = [NSKeyedArchiver archiveRootObject:self.lastLocation toFile:[self lastLocationPersistenceFilePath]]; if (!success) { NSLog(@"Could not persist location for some reason!"); } } #pragma mark - #pragma mark CLLocationManagerDelegate //////////////////////////////////////////////////////////////////////////////////////////////////// - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { // Forward this message to the new iOS 6 delegate method. [self locationManager:manager didUpdateLocations:@[oldLocation]]; } //////////////////////////////////////////////////////////////////////////////////////////////////// - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation *latestLocation = [locations lastObject]; _lastLocation = latestLocation; [self persistLastLocation]; }