0

我有点困惑委托是如何工作的。我相信这个想法是让另一个班级为你做这项工作并给你回电话。所以如果你做了这样的事情:

- (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 中的坐标,即使我 startUpdatingLocation,我的 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 会被设置,但似乎没有。我是否错误地理解了委派?谢谢。

4

4 回答 4

0

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

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

于 2011-04-03T07:29:52.253 回答
0

委托给你的唯一事情是 locationManager 调用你的委托方法。对象通常不会更改其委托的属性。

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

于 2011-04-03T07:31:55.583 回答
0

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

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

所以使用委托你可以说“只要成为我的代表,我最终会回复你,我们现在已经完成了”。然后该对象可以在方便时返回给调用者,而不是相反(仅在主应用程序需要时才调用)。

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

于 2011-04-03T07:36:05.963 回答
0

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

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

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

于 2011-04-03T08:03:03.363 回答