从对象init的GCD安全地调用后来的UIViewController方法

时间:2013-07-31 19:24:51

标签: iphone ios objective-c

感谢Lock a NSMutableArray of an object but not the rest of my object when using GCD我有一个用户对象,它通过初始化的gcd填充一个位置数组,希望当我们模态地到达LocationViewController时,user.locations中存在位置(用户)传递给viewcontrollers),如果它们不在那里,我只需在选择器中显示'loading ...'。

我希望在dispatch_sync方法中强制刷新用户的gcd。我可以为LocationViewController添加一个方法来刷新选择器等,但我不知道如何安全地访问它。

我的第一个想法是在LocationViewController中,如果位置不存在(即nil),那么在用户中设置对此LocationViewController的引用。在dispatch_sync内,如果locCont不为零,我可以调用方法[locCont mymethod]。但是我不确定如何在用户类中设置属性?

@property (strong, nonatomic) LocationsViewController * locCont;

让我担心的是用户可以在任何时候注销并返回到根视图。然后我会设置

user.locCont = nil

ARC会很好地对任何宿醉内存进行排序吗?

我的另一个问题是如果他们不选择设置位置并且稍后查看会发生什么。我想我可以通过在user.locCont中将prepareforsegue设置为nil来处理这个问题。

如果用户到达那里,是否有更好的方法让LocationsViewController刷新?

2 个答案:

答案 0 :(得分:2)

我建议使用通知来避免“用户”对象和视图控制器之间的强连接。

LocationViewController将在其init方法中注册自定义通知 并在dealloc中取消注册。

GCD代码在完成后“发布”通知。这会导致所有听众 要通知,以便LocationViewController可以刷新其视图。

请参阅NSNotificationCenter文档,以及 Send and receive messages through NSNotificationCenter in Objective-C?提供有助于开始的好示例代码。

答案 1 :(得分:0)

如果您检索到某些user对象异步发生的数据,并且您希望视图控制器能够访问此对象,则通常会对此user对象保留一些外部引用。一种常见的方法是使这个user对象成为单例。另一种方法是将其作为app委托的属性。无论哪种方式,user对象可能都不会维护对任何视图控制器的引用。 user对象只是异步检索信息,视图控制器可以通过单例或app委托访问user对象的当前状态。

如果您希望user对象能够在数据检索完成时通知视图控制器,您可能需要通过通知中心发布通知。视图控制器可以注册自己以观察这些通知(并且在视图控制器自我解除之前,将其自身移除为该通知的观察者)。