对象 A 如何等待对象 B 在其核心位置委托中完成获取位置数据,以便它可以使用数据?
Posted
技术标签:
【中文标题】对象 A 如何等待对象 B 在其核心位置委托中完成获取位置数据,以便它可以使用数据?【英文标题】:How does Object A wait for Object B to complete getting location data in its Core Location Delegate, so it can use the data? 【发布时间】:2011-04-17 01:05:29 【问题描述】: 对象 A 调用对象 B 以启动 Core Location 并获取位置数据。 对象 B 也是 Core Location Delegate 并接收到成功的回调,接收到数据。对象 B 的委托停止核心位置,因为只需要一个位置数据点。
对象 A 想要使用该位置数据,并且确实可以访问对象 B 中的位置变量
问题是对象 A 在对象 B 获取核心位置数据之前尝试使用这些空变量。对象 A 继续比赛,对象 B 的核心位置数据尚不可用。
对象 A 如何有效地“等待”,或收到数据存在且可以继续进行的通知?
谢谢,瑞克
【问题讨论】:
【参考方案1】:简单的方法,NSNotificationCenter。
在对象 B 头文件中:
extern NSString *const kLocationKey;
extern NSString *const kIGotLocationNotification; // whatever name you like
在对象 B 的实现文件中:
// assign a string we will use for the notification center
NSString *const kIGotLocationNotification = @"Any text you like here";
NSString *const kLocationKey = @"Location";
// in the method where you stop core location
CLLocation *loc;
// create a dictionary object with the location info
NSDictionary *dict = [NSDictionary dictionaryWithObject:loc forKey:kLocationKey];
// you post a notification to the default center
[[NSNotificationCenter defaultCenter] postNotificationName:kIGotLocationNotification object:self userInfo:dict];
在对象A的实现文件中:
// inside your init method
// become an observer with the default center
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleIGotLocation:) name:kIGotLocationNotification object:nil];
// inside your dealloc
// don't forget to remove yourself from the notification default center
[[NSNotificationCenter defaultCenter] removeObserver:self];
// create the selector that will receive the notification
- (void)handleIGotLocation:(NSNotification *)pNotification
NSLog(@"Name: %@", [pNotification name]);
NSLog(@"Object: %@", [pNotification object]);
// the user info is going to contain the dict with your location
NSLog(@"UserInfo: %@", [pNotification userInfo]);
【讨论】:
如果我将对象 A 的代码作为视图控制器,则使用 NSNotificationCenter 的想法有效,它在系统运行循环中停止。我实际上已经将对象 A 的代码放在 App Delegate 的 ApplicationDidFinishLaunching 中,但问题是它没有停止,它继续运行到方法结束。没有机会等待通知。我将不得不重新考虑对象 A 的代码从哪里运行。 你失去了我。到底是用什么方法运行的?在您的问题中发布您正在谈论的方法。 嗯,想要使用 Loc 数据的代码在 AppDidFinishLaunching 中。该代码方法不等待任何人,它将运行到它的末尾(方法的)。没有办法停止并等待 loc 数据在那里可用。我必须重新考虑请求此核心位置代码的位置。 不,您不想在 AppDidFinishLaunching 中等待。正如您所说,您将不得不重新考虑您的核心位置代码。也许使用一个标志来表明你有这个位置。并且任何需要位置的代码都可以检查标志以查看它是否为 YES。以上是关于对象 A 如何等待对象 B 在其核心位置委托中完成获取位置数据,以便它可以使用数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何等待 Android runOnUiThread 完成?