a) Разве я не должен вызывать службу из метода FinishedLaunching в AppDelegate?
У вас есть ограниченное время для запуска и запуска вашего приложения, т. Е. Возвращение с FinishedLaunching
, иначе сторожевой таймер iOS убьет ваше приложение. Это всего около 17 секунд (но может варьироваться в зависимости от устройства / версии iOS).
Все, что занимает некоторое время, лучше сделать в другом потоке, запущенном с FinishedLaunching
. Еще более важно, если вы используете сетевые сервисы, так как не можете быть уверены, сколько времени (или даже если) вы получите ответ.
б) Неправильно ли я звоню в службу?
Это выглядит хорошо. Однако помните, что симулятор имеет более быстрый доступ к сети (скорее всего), гораздо больше оперативной памяти и мощности процессора. Большой набор данных может занять много памяти / процессорного времени для декодирования.
Запуск из другого потока, по крайней мере, покроет дополнительное необходимое время. Это может быть так же просто, как добавить код (ниже) внутри вашего FinishedLaunching
.
ThreadPool.QueueUserWorkItem (delegate {
window.BeginInvokeOnMainThread (delegate {
// run your code
});
});
Вы можете посмотреть, как Touch.Unit делает это, взглянув на его TouchRunner.cs исходный файл.
примечание: вы можете захотеть протестировать неиспользование (запрос) сжатых данных, так как время / память для их распаковки могут оказаться бесполезными на устройствах (по сравнению с симулятором). Фактическое тестирование необходимо для подтверждения;)