Идеальный способ получить данные (JSON) из сервиса, использующего Monotouch и iOS? - PullRequest
4 голосов
/ 04 ноября 2011

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

По сути, просто возвращает JSON.

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

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

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

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

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);
          }
     }
}

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

1 Ответ

4 голосов
/ 04 ноября 2011

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...