Rubymotion Dispatch早早退出

时间:2012-05-30 12:08:38

标签: rubymotion

我正在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

3 个答案:

答案 0 :(得分:2)

现在看来,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

答案 1 :(得分:1)

我想我已经找到了这个问题。这是因为我在方法中声明了网址

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

答案 2 :(得分:0)

在我的情况下,在RubyMotion 2.5中声明方法中的url是正常的,但我的应用程序崩溃了EXC_BAD_ACCESS,有时还有其他错误消息,因为应用程序名称中的unicode字符和我的代码。修复编码标题和更改应用程序名称解决了我的问题。令人惊讶的是,该应用程序工作正常,只有在我拨打initWithContentsOfURL时才会崩溃。