在RubyMotion中,当触摸反向链接时,如何取消列表刷新?

时间:2012-10-16 07:02:24

标签: ios grand-central-dispatch dispatch rubymotion

我是RubyMotion的新手,并且很难掌握一些API。

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

这一切都运行正常,但在我的viewDidLoad方法中,其中一个列表控制器我正在调用一个从互联网刷新列表数据的方法。我正在异步Dispatch队列中运行刷新,因此viewDidLoad看起来像这样:

def viewDidLoad
  super

  loadItems

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

我遇到的问题是,如果我进入此列表,等待刷新完成(通过拖尾调试日志)然后返回到另一个列表它没关系,但是如果我进去然后立即退出并进入在刷新完成之前的另一个列表中,应用程序崩溃时出现了一个不可靠的错误,我已经可靠地通知它是一个段错误。

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您是否可以让视图收听“刷新完成”通知?

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

刷新开始处理。

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

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

如果视图在那里,视图中的通知处理程序将获取数据并刷新UI。