Идеальный способ вытащить данные (JSON) из службы с помощью Monotouch и iOS?

У меня есть приложение для iPhone, которое тянет почти все его данные из услуг ASP.NET MVC.

В основном только что вернулся JSON.

Когда я запускаю приложение в симуляторе, данные сбрасываются очень быстро и т. Д. Однако, когда я использую фактическое устройство (3G или WiFi), он очень медленный. До такой степени, что приложение вылетает слишком долго.

a) Должен ли я не звонить услуге из метода FinishedLaunching в AppDelegate?

б) Я неправильно звоню в службу?

Метод, который я использую, выглядит примерно так:

public static JsonValue GetJsonFromURL(string url) { var request = (HttpWebRequest)WebRequest.Create (url); request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; using(var response = (HttpWebResponse)request.GetResponse()) { using(var streamReader = new StreamReader(response.GetResponseStream())) { return JsonValue.Load(streamReader); } } } 

Есть ли лучший или быстрый способ, которым я должен обращаться к службе? Я читал о том, как делать что-то в разных потоках или выполнять асинхронные вызовы, чтобы не блокировать пользовательский интерфейс, но я не уверен, какой лучший подход или как этот код будет работать.

One Solution collect form web for “Идеальный способ вытащить данные (JSON) из службы с помощью Monotouch и iOS?”

a) Должен ли я не звонить услуге из метода FinishedLaunching в AppDelegate?

Вы получаете ограниченное время для запуска своего приложения, т. Е. FinishedLaunching из FinishedLaunching или сторожевой таймер iOS убьет ваше приложение. Это примерно 17 секунд (но может варьироваться в зависимости от версий устройств / iOS).

Все, что занимает некоторое время, лучше сделать в другом потоке, запущенном с FinishedLaunching . Еще более важно, если вы используете сетевые службы, поскольку не можете быть уверены, сколько времени (или даже если) вы получите ответ.

б) Я неправильно звоню в службу?

Это выглядит хорошо. Однако помните, что симулятор имеет более быстрый доступ к сети (скорее всего), намного больше ОЗУ и мощности ЦП. Большой набор данных может потребовать много времени на память / процессор для декодирования.

Запуск из другого потока, по крайней мере, потребует дополнительного времени. Это может быть так же просто, как добавить код (ниже) в ваш FinishedLaunching .

 ThreadPool.QueueUserWorkItem (delegate { window.BeginInvokeOnMainThread (delegate { // run your code }); }); 

Вы можете посмотреть, как Touch.Unit делает это, глядя на исходный файл TouchRunner.cs .

Примечание. Возможно, вы захотите протестировать, не используя (запрашивая) сжатые данные, так как время / память для распаковки может оказаться нецелесообразным на устройствах (по сравнению с симулятором). Фактическое тестирование необходимо подтвердить;)

  • Уведомление о Toast Xamarin iOS
  • Вывести текущую версию приложения в виде строки - Xamarin.iOS
  • IOS: AOT раньше времени, что это?
  • SKPaymentQueue: Что произойдет, если я никогда не позвоню finishTransaction :?
  • Xamarin.iOS UITableView, как заставить ячейку обновлять?
  • MonoTouch.Dialog: ответ на выбор RadioGroup
  • Приложение iOS не заполняет экран iPhone
  • IBInspectable в xamarin
  • Monotouch.Dialog две таблицы
  • Приложение Xamarin Ios Замораживает при запуске при отладке
  • iOS 6 - Управление размером экрана iPhone 5 без по умолчанию 568h@2x.png
  • Как удалить границу выбора в IOS
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.