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

StackOverflow https://stackoverflow.com/questions/1027694

Вопрос

Предыстория:

У меня есть tableview, отображающий около 8 разделов, каждый из которых подкреплен моим собственным классом PlaceList, представляющим список объектов (реализация использует NSMutableArray).Всего насчитывается около 200 объектов.Каждый раздел соответствует тому, насколько далеко находится объект от текущего местоположения (например,в пределах 1 мили, в пределах 10, 25, 50 ... и т.д.).

Время от времени мне нужно отвечать на асинхронные уведомления от CoreLocation, которые требуют, чтобы я пересчитал, к какому разделу относится каждый объект, обновил расстояние для каждого объекта (которое отображается в каждой ячейке), а также повторно использовал каждый список, затем перезагрузил табличное представление.Я также выполняю эту операцию в viewWillAppear.

В рамках операции, которая выполняет обновление (метод в PlaceList), я использовал @synchronized (self) на случай, если ОС вызывает его более чем из одного потока (в настоящее время я сам не использую для этого другой поток).Однако в настоящее время эта операция приводит к тому, что пользовательский интерфейс время от времени кажется "замороженным", поэтому я ищу способы сделать это в собственном потоке.

Вопрос:

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

  • Отправляют ли пользовательский интерфейс и CoreLocation LocationManager свои уведомления в одном потоке, т.е.могу ли я безопасно обойтись без @synchronized (self) в списке мест размещения?

Это было полезно?

Решение

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

Если это правильно, то вот несколько вариантов.

1) Дважды буферизуйте ваши данные.Пока вы отображаете что-то, что "было" правильным, пользователь может взаимодействовать с этим просто отлично.Когда вы получите триггер для повторной обработки ваших данных, поработайте над ним в фоновом режиме с копией, а когда он будет готов к полной перерисовке, обновите.Это обновление может быть резким и масштабным, но отображаемые данные всегда будут корректными или, по крайней мере, вменяемыми, а пользовательский интерфейс продолжит функционировать и не напугает пользователя.

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

AFAIK, приложение Facebook, похоже, делает это так же, как и TwitterFon.По крайней мере, так мне кажется.Трудно сказать наверняка.

2) Экран загрузки!Не весело, но это работает.Когда вы поймете, что данные неверны, откройте полупрозрачную панель и попросите пользователя немного подождать.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top