3

我是 RubyMotion 的新手,正在努力掌握一些 API。

我的应用程序是一个非常基本的 UITable 列表系列,如果您选择一个项目,您将进入该项目的列表,这是通过推送一个新控制器来实现的。

这一切都很好,但在我的列表控制器之一的 viewDidLoad 方法中,我正在调用一个方法,该方法从互联网刷新列表的数据。我在异步调度队列中运行刷新,所以 viewDidLoad 看起来像这样:

def viewDidLoad
  super

  loadItems

  Dispatch::Queue.concurrent.async do
    refreshItems
  end
end

我遇到的问题是,如果我进入此列表,等待刷新完成(通过拖尾调试日志)然后返回并进入另一个列表很好,但如果我进入并立即退出并进入另一个列表之前刷新已完成,应用程序崩溃并出现无法描述的错误,我可靠地告知这是一个段错误。

所以我很确定我需要在关闭控制器之前等待刷新完成,或者在关闭控制器之前以某种方式从调度队列中终止刷新线程。所以我的问题是:

  1. 当您按下左上角返回并关闭当前控制器时,如何捕捉“返回”事件?推动控制器时,您可以免费获得此功能,但我不确定如何捕获返回事件。

  2. 哪种方法是正确的,在关闭控制器之前杀死刷新线程还是等待它完成?杀死它似乎有点不安全,也许我可以向它发送一条消息,要求它完成正在做的事情并退出,然后等待它回复说好的完成。

  3. 您如何获得问题 2 的正确答案?如果我知道如何从 Dispatch'd 线程将消息发送回主线程,这将使这更简单一些。

4

2 回答 2

0

你能让视图监听“刷新完成”通知吗?

在 viewDidLoad 中,视图将自己注册为通知的侦听器,然后启动后台刷新。

刷新开始处理。

用户触摸回来,在 viewDidUnload 中,视图停止监听通知,并消失。

刷新完成(在我的应用程序中,这会写入 CoreData),并发送通知是否存在视图。

如果视图存在,则视图中的通知处理程序会获取数据并刷新 UI。

于 2013-08-01T13:48:18.053 回答
0

在异步调用之外设置一个实例变量并在刷新循环中检查它。离开时将其设置为“false”。

def viewDidLoad
  super

  loadItems

  @refresh = true

  Dispatch::Queue.concurrent.async do
    refreshItems
  end
end

def refreshItems
  # inside your loop
    if @refresh
      # stuff
    end
  # end loop
end

def viewWillDisappear(animated)
  @refresh = false

  super
end
于 2012-10-17T21:33:06.480 回答