对象 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 完成?

代码中哪里是保存核心数据的最佳位置?

在qml中使用model给委托对象MapPolylIne的path属性赋值。

如何在 Javascript 中使用异步等待函数对象?

C#如何使用异步编程

在订阅了另一个对象的事件的委托中使用 (object sender)