Проблемы с основными данными и фоновым потоком - PullRequest
1 голос
/ 30 декабря 2011

с новым годом.

Я работаю с приложением, в котором данные сохраняются с использованием основных данных. Приложение содержит модуль календаря, и пользователю разрешено переходить назад / вперед между датами двумя кнопками (nextDay, previousDay). Каждый день содержит информацию о сомах, которую я получаю из веб-сервиса, и поэтому я хотел бы получить большую часть данных (следующие 14 дней) в фоновом режиме, пока пользователи используют календарь.

Так вот мой подход:

Данные первого дня выбираются основным потоком и сохраняются в постоянном хранилище и представляются пользователю. Затем NSThread запускается в фоновом режиме с новыми данными выборки nsmanagedcontext, и когда все данные выбираются, они сохраняются в постоянном хранилище.

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

Но иногда я получаю следующую ошибку Операция не может быть завершена. (Ошибка какао 133020.) , и тогда основной поток не может сохранить в постоянном хранилище.

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

Я провел много часов, читая различные форумы / блоги, и надеюсь, что кто-нибудь сможет помочь или направить меня в правильном направлении.

привет

решено с помощью: Ошибка, которую я получал, произошла из-за ошибок при объединении при сохранении в моем постоянном хранилище. Я смог решить ее, изменив политику слияния при сохранении. Следующий фрагмент показывает мой метод для инициализации nsmanagedcontext. Где жирным шрифтом показаны настройки политики. Я могу сделать это, потому что данные, которые я получаю, одинаковы, независимо от того, является ли это основным потоком или фоновым потоком.

- (NSManagedObjectContext *)managedObjectContext
{
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
          **[__managedObjectContext setMergePolicy:NSOverwriteMergePolicy];**
    }
    return __managedObjectContext;
}

1 Ответ

1 голос
/ 30 декабря 2011

Согласно http://developer.apple.com/library/ios/#documentation/cocoa/Reference/CoreDataFramework/Miscellaneous/CoreData_Constants/Reference/reference.html ваш код ошибки представляет собой NSManagedObjectMergeError .

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

Подробнее о политике слияния вы можете прочитать здесь: http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSMergePolicy_Class/Reference/Reference.html#/

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