作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道如何使用 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);
- (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;
}
});
});
}
最佳答案
我在后台状态下遇到计时器问题。不能保证你会有一个事件的运行循环,所以在你回到前台之前计时器永远不会触发。我所做的是:
NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop addTimer:myTimer forMode:NSRunLoopCommonModes];
[loop run];
NSNotificationCenter *defaultNotificatoinCenter = [NSNotificationCenter defaultCenter];
[defaultNotificatoinCenter addObserver:self selector:@selector(handleLocationUpdate) name:LocationHandlerDidUpdateLocation object:nil];
self.pinTracker.uploadInterval = 30.00;
self.sharedLocationHandler.recencyThreshold = 5.0;
// Store the location into your sqlite database here
NSLog(@"Received location info: %@ \n Ready for store to database",lastKnowLocationInfo);
// Do your upload to web operations here
关于iphone - 在没有 NSTimer 的情况下每隔几秒调用一次获取当前坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12841017/
我是一名优秀的程序员,十分优秀!