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

ただし、次の2つ機能します。

@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 に答える