iphone dev - асинхронная загрузка содержимого таблицы - PullRequest
0 голосов
/ 18 мая 2010

Мое приложение имеет контроллер навигации, который выдвигает серию просмотров.Один из tableViews загружает XML-файл с URL-адреса и занимает 4-5 секунд.Если я нажму кнопку «Назад» на панели навигации, она будет реагировать только после завершения загрузки содержимого таблицы.Есть ли простой способ загрузить контент асинхронно, чтобы приложение все равно отвечало на мой жест на панели навигации?PS Я ищу это в Интернете, и люди говорят о многопоточности.Я не знаю много о темах, поэтому, пожалуйста, будьте более конкретны.

Ответы [ 5 ]

1 голос
/ 19 мая 2010

Взгляните на пример кода Apple LazyTableImages . Это делает именно это, используя потоки. Также посмотрите на ответы на этот ТАК вопрос .

Этот другой ответ SO содержит код для класса remoteImage, который я использовал для этого, и он хорошо работает.

1 голос
/ 18 мая 2010

Пример приложения Apple XMLPerformance написан специально для демонстрации того, как анализировать XML с помощью синтаксического анализатора libxml2 SAX (через поток). Использование анализатора потока полезно для быстрых асинхронных обновлений, а также для поддержания низкого профиля памяти вашего приложения.

Если вы поместите данные XML в базовое хранилище данных и подключите свое табличное представление к NSFetchedResultsController и его методам делегатов, вы можете заставить свою таблицу постоянно обновляться с помощью очень небольшого кода. Базовые данные и контроллер извлеченных результатов выходят далеко за рамки этого ответа, но вы можете выполнить поиск Stack Overflow и Google для получения дополнительной информации по этим темам.

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

Обратите внимание, что за пределами модели данных обработка представления может быстро усложниться; нажатие на кнопку «назад» приведет к освобождению контроллера представления, а также любых связанных свойств, поэтому вам нужно быть осторожным, чтобы управлять отменой синтаксического анализа XML с вашего контроллера представления, а также управлять любой выделенной памятью для вашей модели данных, которая находится в контроллер представления. В противном случае вы получите утечки памяти или исключения из доступа к освобожденным объектам, как только контроллер представления будет полностью освобожден.

Чтобы упростить это для себя, вам нужно прочитать о NSOperation, NSOperationQueue и KVO, которые помогут вам отслеживать состояние операций и выполнять очистку до того, как контроллер представления отключится. Класс NSOperation облегчает запуск заданий в фоновом режиме. Существуют и другие ручные способы выполнения потоков и блокировки, но они не так приятны и чисты, как NSOperation.

Чтение Документация NSOperation от Apple поможет вам в огромной степени, а также в создании небольших тестовых приложений, которые помогут вам освоиться с различными структурами и классами, связанными с переходом вашего приложения на новый уровень сложности.

1 голос
/ 18 мая 2010

Вы должны асинхронно перезагрузить удаленные данные. Здесь вы найдете дополнительную информацию о том, как загрузить данные с NSURLRequest с объектом делегата. В этом случае ваше приложение не застрянет, пока файл не загрузится полностью (или не произойдет тайм-аут / ошибка).

0 голосов
/ 18 мая 2010

Вы должны посмотреть на NSURLConnection

Обязательно реализуйте:

- (void)connectionDidFinishLoading: (NSURLConnection*)connection
0 голосов
/ 18 мая 2010

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

Основы будут включать один или несколько «рабочих» потоков, которые извлекают XML-файлы и сообщают основному потоку, когда информация доступна. Реализация этого для iPhone / iPad не должна быть слишком сложной, поскольку ОС предоставляет множество потоковых примитивов, которые значительно упрощают эту работу для разработчика.

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