【发布时间】:2012-10-11 13:44:40
【问题描述】:
我知道如何使用 NSTimer 进行此操作,但我不想每隔几秒就获取当前 iPhone 坐标而无需计时器。我无法使用计时器,因为我在应用程序处于后台时获取坐标。
我已经尝试过一些东西,但这会每秒调用一次,而不是每 10 秒调用一次。
我在这里做错了什么?
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *loc = [locations objectAtIndex:0];
NSDate* eventDate = loc.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (howRecent < 10)
{
CLLocation* location = [locations lastObject];
double lat = location.coordinate.latitude;
double lng = location.coordinate.longitude;
NSLog(@"lat:%f lng:%f", lat, lng);
首先尝试每 10 秒执行一次后台任务,但如果我在这里执行任何操作,不知道在哪里设置时间:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^{
dispatch_async(dispatch_get_main_queue(), ^{
if (backgroundTask != UIBackgroundTaskInvalid)
{
[application endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
}
});
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
_pendingLocationsTimer = [NSTimer timerWithTimeInterval:_pendingLocationsTimerDuration
target:self
selector:@selector(_acceptBestAvailableLocation:)
userInfo:nil repeats:NO];
NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop addTimer:_pendingLocationsTimer forMode:NSRunLoopCommonModes];
[loop run];
dispatch_async(dispatch_get_main_queue(), ^{
if (backgroundTask != UIBackgroundTaskInvalid)
{
// if you don't call endBackgroundTask, the OS will exit your app.
[application endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
}
});
});
}
【问题讨论】:
-
仅依赖计时器的问题在于,您在浪费资源而无法控制或配置。在我看来,最好设置您的位置管理器,并配置一个控制器类来广播和响应适用的通知。在回答中查看我的编辑和建议。
-
你不是在每次收到回调时都分配
eventDate和howRecent...这肯定会导致它们在每个 didUpdateLocations 回调跨度>
标签: iphone objective-c ios ios6 core-location