从appdelegate中的线程跨多个视图控制器触发事件

时间:2011-04-25 23:27:50

标签: iphone objective-c multithreading event-handling

我有一个NSAutoreleasePool线程,旨在从Web服务中提取信息,我的Web服务代码运行良好,我可以触发线程在视图控制器中启动而没有任何麻烦,事实上它的工作非常好

我想:

  • 将线程实例化移动到appDelegate - easy!
  • 让它定期运行并以某种方式告诉其下的viewcontrollers(5 - 10)是否下载了新信息
  • 具有在调度程序之外手动执行线程的能力

我可以使用performSelectorOnMainThread在appdelegate上启动一个方法,但是如何让我的子视图控制器“订阅”appdelegate上的方法?

3 个答案:

答案 0 :(得分:3)

使用NSNotificationCenter,您可以发布,通知:D 这样,没有appDelegate现在其他类可以“订阅”他们需要的通知。

另外,我会保持线程活着,每次生成一个新线程都很昂贵,只有经常产生它才会生成。我建议使用GCD(iOS 4+)

答案 1 :(得分:3)

这是你做的:

从发送邮件的班级发布通知,如:

[[NSNotificationCenter defaultCenter] postNotificationName: @"YOUR_NOTIFICATION_NAME" object: anyobjectyouwanttosendalong(can be nil)];

在您希望在发布时通知通知的视图控制器中:

在viewDidLoad中执行:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(METHOD_YOU_WANT_TO_INVOKE_ON_NOTIFICATION_RECEIVED) name:@"YOUR_NOTIFICATION_NAME" object:sameasbefore/nil];

重要!不要忘记你的viewDidUnload():

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"YOUR_NOTIFICATION_NAME" object:sameasbefore/nil];

我不太确定与通知相关联的对象,但您可以查看here

注意:当只有一个对象通知另一个对象时,最好使用协议:)但在这种情况下,由于有多个视图控制器正在侦听,请使用通知

答案 2 :(得分:1)

使用NSNotificationCenter发送视图控制器正在观察的事件?