代码之家  ›  专栏  ›  技术社区  ›  Ben Zotto sberry

当RunLoop事件完成处理时,我如何做一些事情?

  •  1
  • Ben Zotto sberry  · 技术社区  · 14 年前

    我的Cocoa应用程序中有一些处理过程,有时会通过数据的层次结构进行调用,以作为事件的结果来完成大量工作。每一小块都会创建和破坏一些资源。大多数时候我不想拥有这些资源,但我想找到一种聪明的方法,在所有工作之前创建这些资源,并最终杀死它们。

    除了让这些缓冲区等从“父”或其他地方全局可用之外,当事件循环运行结束时,是否有一种方法可以在某些代码中本地知道?然后,如果它们不在那里,我可以创建它们,并将它们保留到运行循环结束之前,在那之前对任何后续调用重用它们。

    编辑:我不想寻求关于如何重组我的代码的建议,我可以做任何事情。这个问题刚刚向我提出了一个问题,如何知道运行循环何时完成。如果我在写,我不知道,javascript,我会用 setTimeout 用零来完成结束事件清理。我想一个间隔为零的nstimer也可以做到这一点,但是想知道是否有更干净的东西。

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  2
  •   bbum    14 年前

    既然你说了“可可”和“NSRULOOP”,我假设你在Mac OS X上。只要你在雪豹上,你就可以使用Grand Central Dispatch优雅地解决这类问题。

    如果是Leopard或更高版本(或iPhone,就这点而言),您可以使用nsOperations来完成相同的操作(代码稍微多一些)。

    所有这些都在 Concurrency Programming Guide .

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

        2
  •  0
  •   Jeffrey Kern    14 年前

    我对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
    

    在程序的其他部分中,检查“已完成”的值,看是否创建了所述对象?

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

    推荐文章