2

阅读 big nerd ranch ios 编程书籍并时不时遇到问题,因为这本书是基于 ios6 的编码,而我使用的是最新版本的 XCode/ios7。

无论如何,目前正在使用核心位置框架并将其添加到我的目标列表中。目前正在尝试获取具有英国伦敦模拟位置的设备的位置。这是我的代码,它有时有效,有时如果无法获取位置会引发错误。

.h 接口文件:

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@interface WhereamiViewController : UIViewController
{
    CLLocationManager *locationManager;

}

@end

.m 实现文件:

#import "WhereamiViewController.h"

@interface WhereamiViewController ()

@end

@implementation WhereamiViewController

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self){
        //create location manager object
        locationManager = [[CLLocationManager alloc] init];

        //there will be a warning from this line of code
        [locationManager setDelegate:self];

        //and we want it to be as accurate as possible
        //regardless of how much time/power it takes
        [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

        //tell our manager to start looking for its location immediately
        [locationManager startUpdatingLocation];
    }

    return self;
}

- (void)locationManager:(CLLocationManager *)manager
         didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"%@", newLocation);
}

- (void)locationManager:(CLLocationManager *)manager
      didFailWithError:(NSError *)error
{
    NSLog(@"Could not find location: %@", error);
}


@end

控制台日志:

2013-10-13 19:21:43.546 Whereami[44554:v4b] <+57.74753400,-134.45332304> +/- 5.00m (speed -1.00 mps / course -1.00) @ 10/13/13, 7:21:43 PM British Summer Time
2013-10-13 19:21:44.545 Whereami[44554:v4b] <+57.74753400,-134.45332304> +/- 5.00m (speed -1.00 mps / course -1.00) @ 10/13/13, 7:21:44 PM British Summer Time
2013-10-13 19:21:45.546 Whereami[44554:v4b] <+57.74753400,-134.45332304> +/- 5.00m (speed -1.00 mps / course -1.00) @ 10/13/13, 7:21:45 PM British Summer Time
2013-10-13 19:21:46.546 Whereami[44554:v4b] <+57.74753400,-134.45332304> +/- 5.00m (speed -1.00 mps / course -1.00) @ 10/13/13, 7:21:46 PM British Summer Time
2013-10-13 19:21:47.547 Whereami[44554:v4b] <+57.74753400,-134.45332304> +/- 5.00m (speed -1.00 mps / course -1.00) @ 10/13/13, 7:21:47 PM British Summer Time
2013-10-13 19:21:48.548 Whereami[44554:v4b] <+57.74753400,-134.45332304> +/- 5.00m (speed -1.00 mps / course -1.00) @ 10/13/13, 7:21:48 PM British Summer Time
2013-10-13 19:21:48.925 Whereami[44554:v4b] <+57.74753400,-134.45332304> +/- 5.00m (speed -1.00 mps / course -1.00) @ 10/13/13, 7:21:48 PM British Summer Time
2013-10-13 19:21:49.926 Whereami[44554:v4b] <+57.74753400,-134.45332304> +/- 5.00m (speed -1.00 mps / course -1.00) @ 

如您所见,有一个无限循环。处理这种情况的最佳方法是什么?我还在学习,不想让事情复杂化。我想跟上这本书的步伐。我明白我遇到的这些小问题对我的学习很有帮助。尝试理解做旧事情的新方法让我意识到有时我必须回到旧方法并完全理解它,然后才能用新方法做。

帮助将不胜感激问候。

4

5 回答 5

2

这不是一个无限循环。locationManager:didUpdateToLocation:fromLocation 是位置管理器定期调用的委托方法,用于使用手机的新位置更新您的 WhereamiViewController。

在行

[locationManager setDelegate:self];

您已经告诉 locationManager 在您的视图控制器上调用 CLLocationManagerDelegate 协议的委托方法。可以通过替换来避免由该行引起的警告

@interface WhereamiViewController : UIViewController

在你的 .h 文件中

@interface WhereamiViewController : UIViewController <CLLocationManagerDelegate>

它告诉编译器 WhereamIViewController 遵守 CLLocationManagerDelegate 协议。您应该注意委托方法 locationManager:didUpdateToLocation:fromLocation 在 iOS6 中已弃用,您应该改用 locationManager:didUpdateLocations。可以在此处找到 CLLocationManagerDelegate 文档。

您可以使用

[locationManager stopUpdatingLocation];

停止通过委托方法接收位置更新或

locationManager.pausesLocationUpdatesAutomatically = YES;

允许位置管理器在位置数据不太可能更改时暂停更新。

有关这种情况的更多信息,了解哪些是 Objective-C 编程的基础,您应该阅读Objective-C 协议

于 2013-10-13T18:45:15.647 回答
0

这不是一个无限循环,它是如何CLLocationManager工作的。它每隔一段时间调用你的委托方法。我认为该属性可能是您正在寻找的distanceFilterCLLocationManager

此外,您应该使用locationManager:didUpdateLocations:,locationManager:didUpdateToLocation:fromLocation:已弃用。

于 2013-10-13T18:43:23.753 回答
0

那不是错误。它就是这样工作的。你应该使用

locationManager:didUpdateLocations:

代替

locationManager:didUpdateToLocation:fromLocation:

在 iOS 6.0 中已弃用

于 2013-10-13T18:43:59.737 回答
0

它不是无限循环,只是位置管理器在您使用最佳进动时会大量调用其委托。在您受到打击后停止检查或使用较低的精度(我认为这会减少呼叫量)。

于 2013-10-13T18:44:05.547 回答
0

这不是一个无限循环。您要求不断更新位置,这就是您所得到的。如果您查看位置更新上的时间戳,它们之间的间隔约为 1 秒。

无限循环是无需执行任何其他操作即可运行的代码:

while (TRUE)
{
   NSLog(@"Log statement);
}

该代码是一个真正的无限循环,会挂起您的程序并导致系统由于不活动而终止它。

如果您指定至少几米的非零距离过滤器(尝试 10 开始),您将大大减少您从位置管理器获得的“喋喋不休”。这将导致它仅在检测到至少指定距离的移动时才向您发送通知。

于 2013-10-13T18:48:30.790 回答