我正在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
答案 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
时才会崩溃。