如何在应用程序启动之间保留CLLocation?

时间:2010-08-25 03:30:20

标签: iphone objective-c ios

我希望在应用启动之间保留2个CLLocations。这是我希望在启动之间存储在内存中的唯一数据。我该怎么做呢? CLLocation是否具有writetofile或将其存储在coredata或NSUserDefaults中?我想存储整个CLLocation对象,不想只存储lat / lon然后做更多的计算等等。谢谢

2 个答案:

答案 0 :(得分:7)

查看文档,我看到CLLocation实现了NSCoding协议。

这意味着您可以使用CLLocationNSKeyedArchiver归档取消归档 NSKeyedUnarchiver个实例。

您还可以将CLLocation的多个实例放在任何实现NSCoder的容器(父)类中,例如NSDictionaryNSArray,然后归档或取消归档整个对象集合。

有关详细信息,请参阅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];    
}