我对代表团的工作方式感到有些困惑。我相信这个想法是让另一个班级为你工作并给你回电话。所以如果你做了这样的事情:
- (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);
}
如果我在viewDidLoad中使用NSLog坐标,即使我是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将被设置,但似乎没有。我不正确地理解代表团吗?感谢。
答案 0 :(得分:0)
启用位置服务后,需要一段时间才能找到位置值。这可能就是为什么你没有在第一个例子中得到结果的原因。 (我认为你必须调用startUpdatingLocation方法) 这里与委托的想法是,您设置为委托的类或多或少承诺实现调用者可以在HE认为必要时调用的方法。
正如您的第二个示例中的方法签名所暗示的那样,Locationmanager是知道更新发生的人,然后委托使他能够采取行动。 如果您不想使用类似的东西,则必须定期查询位置变化
答案 1 :(得分:0)
委托给你的唯一一件事是locationManager调用你的委托方法。对象通常不会更改其委托的属性。
因此,为了确保更新坐标属性,您必须按照自己的方式实现CLLocationManager的委托方法。 实际上我建议你根本不使用locationCoordinate属性,而是使用LocationManager的location属性。
答案 2 :(得分:0)
代表存在的一个主要原因实际上是在你所描述的情况下。
你在一个类中有一些功能,但功能是异步的,即你不能直接获取信息,或者它是异步实现的(例如,从网上下载一个巨大的文件应该/是异步发生,不要将整个界面锁定一分钟+)。
所以使用代表团你可以说“只是成为我的代表,我最终会回复你,我们现在已经完成了”。然后,对象可以在方便时返回给调用者,而不是相反(仅在主应用程序需要时调用)。
如上所述,下载文件等正是委托发挥作用的地方。对于您自己的编码来说,它也是一个非常有用的工具,可以在您的代码中包含代理,如果您必须等待某些其他对象(例如CLLocationManager)的委派,或者您必须处理某些事情在一个单独的线程上(例如解析数据或诸如此类的东西)。
答案 3 :(得分:0)
要了解这里发生了什么,首先应该尝试了解委托模式。它是一种面向对象的模式,适用于许多语言:
http://en.wikipedia.org/wiki/Delegation_pattern
在这种情况下,CLLocationManager执行查找位置的任务。当完成这项任务时,它知道你可能想要对收集的信息做些什么,但它并不真正知道什么。通过将“self”设置为委托,您告诉CLLocationManager当它完成获取位置时,您将处理接下来发生的事情。您可以通过实现locationManager委托方法来实现。当位置管理器完成找到它将调用该方法的位置时,但在此之前不会。在您的第一个NSSLog中,您正在查看位置管理器找出当前纬度之前的纬度。