【问题标题】:Rubymotion Dispatch exiting earlyRubymotion Dispatch 提前退出
【发布时间】:2012-05-30 12:08:37
【问题描述】:

我正在 Rubymotion 中执行一个相当普通的调度队列,但它显然提前退出了。它永远不会通过 initWithContentsOfURL 调用。但是,删除 Dispatch::Queue 包装器并将调用放在主线程中是可行的。

模拟器中的应用程序退出时没有堆栈跟踪或出现问题的指示。我是否误用了调度队列?

def foo
  Dispatch::Queue.concurrent.async do
    error_ptr = Pointer.new(:object)
    data = NSData.alloc.initWithContentsOfURL(
      NSURL.URLWithString(url), options:NSDataReadingUncached, error:error_ptr)
    unless data
      p error_ptr[0]
      return
    end
    json = NSJSONSerialization.JSONObjectWithData(data, options:0, error:error_ptr)
    unless json
      presentError error_ptr[0]
      return
    end
    Dispatch::Queue.main.sync { print_results(json) }
  end
end

def print_results(json)
  p "#{json}"
end

【问题讨论】:

  • 您的代码显示 print_results 方法与您的 Dispatch 调用是内联的——它真的是这样设置的,还是 Dispatch 调用包含在不同的方法中?
  • 它不是内联的。这是一个单独的电话。 Dispatch 应该包含在一个方法中。
  • 那么您的代码在 RubyMotion 1.8 上非常适合我;可能是您尝试加载的特定 URL 有问题?
  • 谢谢迪伦。你让我走上正轨。如果我设置类似url = "http://www.google.com" 的东西,那将失败。但是如果我将字符串直接放在对 URLWithString 的调用中,它就可以工作。
  • 很奇怪。你在哪里设置url?在foo 方法中,还是在代码中的其他地方?

标签: rubymotion


【解决方案1】:

现在看来 RubyMotion 没有正确地保留调度块之外的局部变量,所以可能会得到一个 EXEC_BAD_ACCESS 并崩溃。以下失败:

foo = "some value"
Dispatch::Queue.concurrent.async do
    puts foo
end

但是以下两个起作用:

@foo = "some value"
Dispatch::Queue.concurrent.async do
    puts @foo
end

还有:

foo = "some value"
foo.retain
Dispatch::Queue.concurrent.async do
    puts foo
    foo.release
end

【讨论】:

    【解决方案2】:

    我想我找到了问题所在。那是因为我在方法中声明了url

    def foo
    url = "www.google.com"
      Dispatch
        take action on url
      end
    end
    

    通过将 url 声明移入 Dispatch 线程,它可以工作。我认为这是一个方法局部变量在任务有时间执行之前超出范围的问题。

    def foo
      Dispatch
        url = "www.google.com"
        take action on url
      end
    end
    

    【讨论】:

      【解决方案3】:

      在我的例子中,在 RubyMotion 2.5 中声明方法中的 url 很好,但我的应用程序因EXC_BAD_ACCESS 而崩溃,有时由于应用程序名称和我的代码中的 unicode 字符导致其他错误消息。修复编码头和更改应用程序名称解决了我的问题。令人惊讶的是,该应用程序运行良好,仅在我调用 initWithContentsOfURL 时崩溃。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-20
        • 2012-05-26
        • 2020-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多