繁体   English   中英

关于Objective-C中的委托,CLLocationManager的问题

[英]Question about delegation in Objective-C, CLLocationManager

我有点困惑代表团如何工作。 我相信这个想法是让另一个班级为您完成工作并给您回电。 因此,如果您执行以下操作:

- (void)viewDidLoad {
    [super viewDidLoad];
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    if (CLLocationManager.locationServicesEnabled == YES) {
        NSLog(@"location enabled");
        latitudeLabel.text = [NSString stringWithFormat:@""];
        [locationManager startUpdatingLocation];
    }
    NSLog(@"%g", locationCoordinate.latitude);
}

如果我NSLog在viewDidLoad中的坐标,即使我启动了UpUpdatingLocation,我的locationCoordinate属性的值也是0。但是,如果我NSLog在委托方法中的值是这样的:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    NSString *latitudeString = [[NSString alloc] initWithFormat: @"%g m", newLocation.coordinate.latitude];
    latitudeLabel.text = latitudeString;
    [latitudeString release];
    locationCoordinate = newLocation.coordinate;
    NSLog(@"in delegate: %g", locationCoordinate.latitude);
}

我得到一个实际的位置值。 我以为通过使用委托方法,可以设置我的locationProperty,但似乎没有。 我对代表团的理解不正确吗? 谢谢。

启用位置服务后,需要一段时间才能找到位置值。 这可能就是为什么您在第一个示例中没有得到结果的原因。 (那,我认为您必须调用startUpdatingLocation方法)。
这里使用委托的想法是,您设置为委托的类或多或少会承诺实现调用者可以在他认为有必要时调用的方法。

就像第二个示例中的方法签名所暗示的那样,Locationmanager是知道更新发生的人,委托使他能够采取行动。 如果您不使用类似方法,则必须定期查询位置变化

委派获得的唯一结果是locationManager调用您的委派方法。 对象通常不更改其委托人的属性。

因此,要确保您的坐标属性已更新,则必须以您的方式实现CLLocationManager的委托方法。 实际上,我建议您根本不要使用locationCoordinate属性,而应使用LocationManager的location属性。

实际上,存在代表的一个主要原因是在您所描述的情况下。

您在一个类中有一些功能,但是该功能是异步的,即您不能随便获取信息,也不是异步实现的(例如,应该/确实异步发生从网上下载大文件,一分钟不锁定整个界面)。

因此,使用委派您可以说“只要成为我的代表,我最终会与您联系,我们现在就完成了”。 然后,对象可以在方便时返回调用者,而不是相反(仅在主应用程序需要时才调用)。

如前所述,下载文件等正是委派发挥作用的地方。 对于您自己的代码来说,它也是一个非常有用的工具,可以在您需要等待来自其他对象 (例如CLLocationManager)的委派,或者您必须在单独的线程上处理某些事情(例如,解析数据或其他内容)。

要了解这里发生的情况,您首先应该尝试了解委托模式。 这是一种面向对象的模式,适用于许多语言:

http://en.wikipedia.org/wiki/Delegation_pattern

在这种情况下,CLLocationManager执行查找位置的任务。 完成此任务后,它知道您可能想对它收集到的信息做些事情,但实际上并不清楚。 通过将“ self”设置为代表,您将告诉CLLocationManager完成位置获取后,您将处理接下来发生的事情。 您可以通过实现locationManager委托方法来实现。 当位置管理器完成查找位置后,它将调用该方法,但在此之前不会调用。 在您的第一个NSSLog中,您正在查看位置管理器确定纬度之前的纬度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM