Извлечение основных данных в фоновом режиме - PullRequest
3 голосов
/ 14 ноября 2009

У меня есть представление навигации с табличным представлением, при щелчке строки строка indexPath передается следующему представлению.

в представлении сведений viewDidLoad, я получаю данные из Core Data. я использую выборку из приложения делегата

[appDelegate loadItem:i];

Как видите, я передаю только одно целое число, которое содержит номер строки.

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

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

Я хочу самый простой способ, так как я новичок. Размещение некоторых кодов будет отличным. или ссылки:)

1 Ответ

15 голосов
/ 14 ноября 2009

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

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

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

Похоже, что пример приложения BackgroundFetching показывает, как это сделать, но у меня его нет в моей системе.

Однако, прежде чем вы слишком углубитесь в многопоточность своего запроса на выборку, я бы тщательно рассмотрел, почему загрузка занимает так много времени. Сначала я бы рекомендовал использовать -setFetchBatchSize: в вашем NSFetchRequest, чтобы ограничить количество объектов, загружаемых в память через вашу выборку (что также сэкономит вам много памяти). Затем я бы использовал -setPropertiesToFetch: чтобы ограничить свойства, выбранные только теми, которые вы будете использовать немедленно.

...