0

在我的位置应用程序实现的didUpdateToLocation方法中。此方法每秒调用一次并提供位置数据。但我不需要每秒获取位置,我只需要每 5 分钟触发一次此方法。是否有可能做到这一点?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //initialize location lisetener on Application startup
    self.myLocationManager = [[CLLocationManager alloc]init];
    self.myLocationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.myLocationManager.delegate = self;
    [self.myLocationManager startUpdatingLocation];


    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.viewController = [[INNOViewController alloc] initWithNibName:@"INNOViewController_iPhone" bundle:nil];
    } else {
        self.viewController = [[INNOViewController alloc] initWithNibName:@"INNOViewController_iPad" bundle:nil];
    }
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}


-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    /*
    if(self.executingInBackground)
    {
        NSLog(@"Aplication running in background");
    }
    else
    {
        NSLog(@"Aplication NOT running in background");
    }
     */


    //NSLog(@"new location->%@ and old location -> %@",newLocation,oldLocation);

    NSString *urlAsString = @"http://www.apple.com";

    NSURL *url=[NSURL URLWithString:urlAsString];

    NSURLRequest *urlRequest=[NSURLRequest requestWithURL:url];

    NSOperationQueue *queue = [[NSOperationQueue alloc]init];


    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

        if ([data length] > 0 && error == nil) {
            NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"Downloaded html -> %@",html);
            //NSLog(@"Downloaded successfully");
        }
        else if([data length] == 0 && error == nil)
        {
            NSLog(@"Nothing downloaded");
        }
        else
        {
            NSLog(@"Error occured -> %@",error);
        }

    }];
}
4

4 回答 4

3

它之所以这么快被调用是因为您要求kCLLocationAccuracyBest. 后退一点。它不是基于时间,而是基于增量距离。在该精度下,即使距离的微小变化也会在接收良好的区域触发更新。使用不同的值。

同样,这些方法并不意味着基于时间使用。它们旨在基于delta distance使用。

于 2013-04-24T08:30:59.190 回答
2

降低准确率和距离过滤器,这将降低调用该方法的频率
如果您希望在 5 分钟后调用它,那么您可以强制每五分钟调用一次方法 stopupdating 和 startupdating

于 2013-04-24T08:30:37.733 回答
1

代替:

[self.myLocationManager startUpdatingLocation];

利用:

[self.myLocationManager startMonitoringSignificantLocationChanges];

如果您使用:startUpdatingLocation它将每秒调用委托方法。当您使用startMonitoringSignificantLocationChanges它时,当位置发生重大变化时或在 5 分钟间隔后调用委托方法。


startMonitoringSignificantLocationChanges

根据重大的位置变化开始生成更新。 - (void)startMonitoringSignificantLocationChanges

讨论

此方法以异步方式启动位置事件的传递,并在您调用它后立即返回。位置事件被传递到您的委托的 locationManager:didUpdateLocations: 方法。要传递的第一个事件通常是最近缓存的位置事件(如果有),但在某些情况下可能是较新的事件。获取当前位置修复可能需要几秒钟的时间,因此请务必检查委托方法中位置事件的时间戳。

在返回当前位置定位后,接收器仅在检测到用户位置发生重大变化时才生成更新事件。例如,当设备与不同的蜂窝塔相关联时,它可能会生成一个新事件。它不依赖 distanceFilter 属性中的值来生成事件。连续多次调用此方法不会自动生成新事件。但是,在两者之间调用 stopMonitoringSignificantLocationChanges 确实会导致在您下次调用此方法时发送一个新的初始事件。

如果您启动此服务并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台。在这种情况下,传递给应用程序委托的 locationManager:didUpdateLocations: 方法的选项字典包含键 UIApplicationLaunchOptionsLocationKey 以指示您的应用程序是由于位置事件而启动的。重新启动后,您仍然必须配置位置管理器对象并调用此方法以继续接收位置事件。当您重新启动位置服务时,当前事件会立即传递给您的委托。此外,即使在您启动位置服务之前,您的位置管理器对象的位置属性也会填充最新的位置对象。

除了实现 locationManager:didUpdateLocations: 方法的委托对象之外,它还应该实现 locationManager:didFailWithError: 方法来响应潜在的错误。

注意:只要设备从之前的通知移动 500 米或更远,应用程序就会收到通知。它不应期望通知的频率超过每五分钟一次。如果设备能够从网络检索数据,则位置管理器更有可能及时传递通知。

在 CLLocationManager.h 中声明

参考CLLocationManager

于 2013-04-24T08:31:07.897 回答
1

您可以使用startMonitoringSignificantLocationChanges而不是startUpdatingLocation. 只有当用户从最后一个位置移动约 500 米时,您才会更新

于 2013-04-24T08:32:21.073 回答