2012-05-30 5 views
3

Я выполняю довольно ванильную очередь отправки в Rubymotion, однако она, по-видимому, выходит рано. Он никогда не проходит через вызов initWithContentsOfURL. Однако удаление оболочки Dispatch :: Queue и выполнение вызовов в основном потоке.Rubymotion Dispatch выход изначальный

Приложение в симуляторе выходит без трассировки стека или с указанием того, что пошло не так. Я неправильно использую очередь отправки?

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

Я думаю, что я отследил проблему. Это потому, что я объявлял URL в методе

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

В моем случае, объявляя URL в методе был штраф в RubyMotion 2.5 , но мое приложение разбилось с EXC_BAD_ACCESS, а иногда и с другими сообщениями об ошибках из-за символов Unicode в имени приложения и во всем моем коде. Исправление заголовка кодировки и изменение имени приложения решили мою проблему. Удивительно, но приложение работало нормально и разбилось только тогда, когда я позвонил initWithContentsOfURL.

Смежные вопросы