Как выполнить сетевую задачу в фоновом потоке при обновлении UITableView? - PullRequest
2 голосов
/ 10 февраля 2011

просто пытаюсь выяснить, что было бы лучшим способом разработать такую ​​функциональность? По сути, я посылаю асинхронный NSURLConnection, который попадает на сервер, который отправляет обратно кучу данных. Как только я получу данные, мне придется выполнить над ними некоторую работу, которая будет довольно дорогой и которую я бы предпочел сделать в потоке bg, чтобы предотвратить блокировку пользовательского интерфейса. И, наконец, мне также необходимо динамически обновлять подходящее обновление, поскольку ответ от сервера принимается и обрабатывается.

Мой вопрос: как мне выполнить эту работу в фоновом потоке , когда данные поступают так, чтобы таблица не дожидалась загрузки всех данных перед обновлением?

Это мой псевдокод, который у меня есть. В моем ViewController у меня было бы два BOOL-флага newDataReceived и dataFinishedDownloading. У меня также будет две переменные: строка, содержащая текущие данные, и nsarray, в котором хранятся результаты обработки данных. Тогда,

  1. в didReceiveResponse: я бы породил новый поток, вызвав executeSelectorInBackground: с методом обработки в качестве селектора.
  2. в этом методе у меня будет цикл, который сначала проверяет newDataReceived, чтобы увидеть, поступили ли новые данные, и если да, то поработать над ними.
  3. После завершения обработки я бы установил nsarray с результатами, а затем вызвал другой метод, который обновляет источник данных таблицы и перезагружает таблицу с помощью executeSelectorOnMainThread:
  4. Наконец, я бы проверил флаг dataFinishedLoading, чтобы увидеть, есть ли еще данные для обработки
  5. если все еще есть данные и все начнется заново, в противном случае очистите поток и выйдите из

Также в didReceiveData будет установлен флаг newDataReceived: а также фактические полученные данные. Наконец, в didFinishLoading я бы установил флаг dataFinishedLoading, чтобы сигнализировать, что все данные были загружены.

Я планирую использовать NSLock в # 2-4 при проверке флагов состояния, а также при получении и установке полученной строки данных и результатов nsarray.

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

ТНХ

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Вы можете взглянуть на NSOperation и NSOperationQueue. NSOperation является идеальной альтернативой для выполнения сложных вычислений и операций в фоновом режиме. Если вам необходимо постоянно обновлять представление таблицы, вы можете реализовать в своей Операции некоторый протокол для обработки обратных вызовов к представлению таблицы.

0 голосов
/ 10 февраля 2011

То, что вы хотите сделать, может быть достигнуто с помощью методов executeSelectorOn ....Посмотрите на это: http://arstechnica.com/civis/viewtopic.php?f=20&t=49035

Просто имейте в виду, что обновления пользовательского интерфейса должны выполняться в основном потоке (поэтому используйте executeSelectorOnMainThread для обновлений пользовательского интерфейса).

...