当runloop事件处理完成后,我该怎么办?

时间:2010-06-12 22:29:20

标签: cocoa nsrunloop

我在我的Cocoa应用程序中有一些处理,有时最终会通过数据层次结构来调用,以便在事件结束时进行大量工作。每一小块都会创造并摧毁一些资源。我大多数时间都不想要这些资源,但我希望找到一种聪明的方法来在所有工作之前创建它们并在最后杀死它们。

如果从“父”或其他地方全局使用这些缓冲区等,有没有办法在事件循环运行结束时在某些代码中本地知道?然后我可以创建它们,如果它们不在那里,并保持它们直到运行循环结束,在那之前重新使用它们进行任何后续调用。

编辑:我不是在寻找有关如何重构我的代码的建议,我可能会这样做。这个问题刚刚为我提出了如何知道runloop何时完成的问题。如果我正在写作,我不知道,Javascript,我会使用零setTimeout来完成最终事件清理。我想一个间隔为零的NSTimer也可以实现这一点,但想知道是否有更清洁的东西。

感谢。

2 个答案:

答案 0 :(得分:2)

既然您说过“Cocoa”和“NSRunLoop”,我将假设您使用的是Mac OS X.只要您使用Snow Leopard,就可以使用Grand Central Dispatch非常优雅地解决此类问题

如果在Leopard或更高版本(或iPhone,就此问题),您可以使用NSOperations执行相同操作(稍微多一点代码)。

所有这些都在Concurrency Programming Guide中进行了讨论。

即使您的算法不是设计为从主线程执行 - 在主事件循环之外 - 您仍然可以解决为“稍后”调度内容的问题,通过串行执行主要队列。

答案 1 :(得分:0)

我对Cocoa中的编程比较陌生,但这不是很容易通过带有该变量的getter的类级变量来实现的吗?

假设你的代码是这样的,伪代码:

bool completed = false;

void chi
  if completed = false
    create foo;
    create bar;

   completed = true 
  end if

  while looping
     ...
  loop

  completed = false;
  destroy foo
  destroy bar

在程序的其他部分中,检查'completed'的值以查看是否已创建所述对象?

编辑:我只是重新阅读您的问题并进行相应的编辑。如果这是一个多线程应用程序,您还需要确保您的对象是线程安全的。