Фоновая сортировка основных данных - PullRequest
3 голосов
/ 08 ноября 2011

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

Из того, что я прочиталСуществует два способа представления отсортированного массива:

Rep1 : определение извлеченного свойства в Department (сортировка выполняется Core Data);

Rep2: ведение переменной экземпляра sortedEmployees (NSArray из Employee объектов) в Отделе (сортировка выполняется моим кодом).

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

Я пробовал несколько методов, которые все оказались бесполезными:

Method1 (используя Rep1 ): В фоновых потоках (используя NSOperationQueue) извлеките все Departments, затем выполните свойство каждого из них.Затем вернитесь в основной поток, найдите соответствующий объект Department в контексте управляемого объекта основного потока ( MOC ) ( NSManagedObjectID ) и используйте свойство fetched.Проблема с Method1: свойство fetched в объекте Department основного потока не заполняется даже после завершения фоновой выборки Department, что означает, что оно повторно выбирается в Department из основного потока!Это побеждает всю цель фоновой выборки.Неправильно ли я предположить, что извлеченное свойство после извлечения существует во всех MOC?

Method2 (с использованием Rep2 ): в фоновых потоках (с использованием * 1046)*), извлеките все Departments, затем вычислите каждый массив sortedEmployees.Затем вернитесь в основной поток, найдите соответствующий объект Department в основных потоках MOC ( NSManagedObjectID ) и установите вышеупомянутый массив для этого объекта .Проблема с Method2: Объектами в массиве sortedEmployees являются Employee объекты, принадлежащие фоновому потоку MOC .Когда основной поток пытается получить к ним доступ позже, происходит сбой с чем-то вроде "NSManagedObject with ID ... has been invalidated." Это связано с тем, что каждый поток должен иметь свой собственный MOC (и связанные с ним управляемые объекты).

Так как же сортировать управляемые объектывообще в фоновом режиме, если управляемые объекты не могут существовать через границы потоков?Я что-то упустил?

1 Ответ

1 голос
/ 09 ноября 2011

Пий,

Вы ничего не упускаете. Вам просто нужно преобразовать отсортированный массив в новый MOC. Вот фрагмент:

NSMutableArray *ma = [NSMutableArray arrayWithCapacity: array.count];

for (mo in array) {

    [ma addObject: [moc objectWithID: mo.objectID]];
}
return ma;

Это перенесет ваш массив. Насколько я понимаю, это эффективный процесс. Кроме того, вы можете зависеть от кэша строк для высокопроизводительного доступа к свойствам.

Andrew

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