iphone Asynch загрузка и обработка нескольких процессов - PullRequest
0 голосов
/ 28 июня 2011

У меня есть базовый архитектурный вопрос о том, как обрабатывать асинхронную загрузку или действительно любую программу, имеющую цепочку событий, и каждое событие не запускается до тех пор, пока не завершится предшествующее событие, как бы долго это ни занимало.

Если я собираюсь загрузить данные, а затем выполнить действие после завершения загрузки, но в то же время я хочу сделать что-то еще (например, показать индикатор прогресса, заставку или что-то еще), имеет ли смысл разработать программу так:

-(void)thisMethodStartsTheDownloading{
       //start the download using NSURLConnection (I'm fine with these details)

       //show a UIView for a splash screen image or do anything else you want to do
 }


 -(void)thisMethodRunsWhenDownloadIsFinished{
        //hide or remove the splash screen (if applicable)
        //do whatever I need to do with the downloaded data
        //this method does not run on its own unless called when NSURLConnection is done
  }


  - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        //do whatever I need to do with my downloaded data

    [self performSelector:@selector(thisMethodRunsWhenDownloadIsFinished)];
       // or [self thisMethodRunsWhenDownloadIsFinished];
   }

  - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
       //incrementally appendData as it comes in from the download process
          [receivedData appendData:data];
   }

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

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

Ответы [ 2 ]

1 голос
/ 29 июня 2011

Да.

Стандартный и надежный способ разработки программы - организовать весь код в ответ на событие. Ваша терминология («цепочка процессов») мне незнакома, но звучит так, будто вы спрашиваете, можете ли вы перевести последовательность или сценарий (как вы хотите, чтобы дела шли) в среду, основанную на событиях.

По правде говоря, иногда данные не поступают из сети, или не все, или это занимает много времени. Таким образом, представление о «загрузке данных» как о шаге в многоэтапном процессе скрывает множество проблем, с которыми приходится сталкиваться настоящему приложению.

Если ваш пошаговый процесс таков:

  1. Показать индикатор выполнения
  2. Начать загрузку
  3. Цикл: получить данные, обновить индикатор выполнения
  4. Скрыть индикатор выполнения
  5. Что-то делать с данными

Так что да, вы переводите это на события и реакции:

  • Приложение завершило запуск: показать индикатор выполнения, начать загрузку
  • Первые данные поступили: инициализировать буфер, установить индикатор выполнения на ноль
  • Получено больше данных: добавлено в буфер, обновлен индикатор выполнения
  • Соединение разорвано: отобразить предупреждение (попробуйте снова, отменить)
  • Пользователь нажал, попробуйте еще раз: начать загрузку
  • Пользователь нажал кнопку отмены: удалить индикатор выполнения, показать что-то еще
  • Загрузка завершена: скрыть индикатор выполнения, сделать что-то еще

В то время как первый способ легче следовать в качестве повествования, второй способ лучше справляется с проблемами и крайними случаями (например, перенаправление HTTP приводит к тому, что событие «первые данные поступило» происходит дважды).

1 голос
/ 29 июня 2011

Взгляните на https://github.com/jdg/MBProgressHUD.

Вы правильно поняли. Вы просто соединяете каждый вызов в следующий, аналогично тому, как работает UINavigationController.

Использование MBProgressHUD с чем-то вроде http://allseeing -i.com / ASIHTTPRequest / даст вам почти все, что вам понадобится для такого рода задач.

Посмотрите, как это делается с помощью стандартных библиотек:

https://github.com/jdg/MBProgressHUD/blob/master/Demo/Classes/HudDemoViewController.m

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