3

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

3 回答 3

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
于 2012-06-13T18:45:37.930 回答
1

我想我找到了这个问题。这是因为我在方法中声明了 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
于 2012-06-01T13:21:20.350 回答
0

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

于 2013-08-05T08:18:13.023 回答