2013-04-24 3 views
0

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

Через приложение у меня есть один управляемый объектОбъект, который я получаю из делегата приложения каждый раз, когда создаю fetchController. Код делегирования приложения

- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (__managedObjectContext != nil) { 
     return __managedObjectContext; 
    } 

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

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

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

+0

Вы используете инициализацию своего MOC с ограничением потока, поэтому вы должны использовать его только в потоке, который его создал ... скорее всего, основной поток. В этом нет ничего неправильного ... но как вы создаете MOC для сохранения фона? Если вы используете тот же MOC, это ваша проблема. Прочтите документацию по параллелизму с основными данными. –

ответ

0

Контексты управляемого объекта не являются потокобезопасными, поэтому, если вы используете один и тот же один более чем один поток без учета параллелизма - у вас будут серьезные проблемы. Как и в случае сбоя и/или потери данных и, возможно, даже повреждения данных. Есть несколько способов справиться с этим:

  1. Используйте один из типов параллелизма в очереди при создании context-- см документации для initWithConcurrencyType:. Затем, всякий раз, когда вы обращаетесь к хранилищу данных, используйте либо performBlock:, либо performBlockAndWait: для синхронизации доступа.

  2. Создайте новый контекст управляемого объекта для фонового потока. Используйте NSManagedObjectContextDidSaveNotification и mergeChangesFromContextDidSaveNotification:, чтобы синхронизировать несколько контекстов.

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

Смежные вопросы