2012-05-30 29 views
3

我在Rubymotion中執行一個相當的香草調度隊列,但它顯然早退了。它永遠不會超過initWithContentsOfURL調用。但是,刪除Dispatch :: Queue包裝並將調用放入主線程中。Rubymotion調度退出提前

模擬器中的應用程序退出時沒有堆棧跟蹤或指示出了什麼問題。我錯在使用調度隊列嗎?

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

您的代碼顯示'print_results'方法與您的'Dispatch'調用內嵌 - 它是真的這樣設置,還是包含在不同方法中的'Dispatch'調用? –

+0

它沒有內聯。這是一個單獨的電話。調度應該包含在一個方法中。 – nathasm

+0

那麼你的代碼在RubyMotion 1.8上對我完全適用;也許這是你想加載的具體URL的問題? –

回答

1

我想我跟蹤了這​​個問題。這是因爲我的方法

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

通過對調度線程移動網址聲明宣佈URL,它的工作原理。我認爲這是在任務有時間執行之前,局部變量超出範圍的一個方法。

def foo 
    Dispatch 
    url = "www.google.com" 
    take action on url 
    end 
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 
0

在我的情況下,在方法聲明網址在RubyMotion 2.5被罰款,但是我的應用崩潰了EXC_BAD_ACCESS,並且有時會因爲應用名稱中的unicode字符以及我的代碼而出現其他錯誤消息。修復編碼標題和更改應用程序名稱解決了我的問題。令人驚訝的是,該應用程序工作正常,只有當我撥打initWithContentsOfURL時纔會崩潰。