2012-02-16 1 views
0

Я синхронизируюсь с базой данных MySQL.Можете ли вы отредактировать тот же NSManagedObject в двух разных ManagedObjectContexts и объединить их изменения?

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

Поэтому вместо этого я хотел пропустить все мои новые/измененные объекты и установить внешние ключи по одному. Итак, первый проход над моими объектами устанавливает fk1, мои следующие наборы fk2, и так далее ...

Прохладные запросы на выборку резко уменьшены. Теперь мне любопытно, могу ли я нарисовать эти fk-сеттеры. Они не зависят друг от друга, но они изменяют один и тот же объект, хотя они устанавливают только одно отношение, и это разные отношения. Говоря в общих словах, эти изменения могут быть «объединены» вместе без каких-либо конфликтов, но можно ли вносить изменения в один дочерний элемент managedObjectContext (childContext: save) до parentManagedObjectContext (parent: выполнитьBlock^{parent: save)) и вытащить это в другом, другом child managedObjectContext (???)? Или политика слияния будет принимать только одну версию объекта childContext и оставить остальные fks без изменений.

Я знаю, что существует: NSManagedObjectContext/refreshObject: mergeChanges:

Но это на объекте по уровню объекта. Это вызовет кучу выборки? Или это будет обновлять весь мой контекст сразу/в партиях?

По предложению компании Apple отсюда: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html Я создал/обновил свои ценности, прежде чем начать установки каких-либо отношений, так что все объекты уже существуют, прежде чем я пытаюсь указать любые отношения на них.

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

ответ

0

I'n не уверен, что вы пытаетесь делать и почему (вы можете написать меньше строк в вашем вопросе и быть более ясно), но вот некоторые рекомендации для работы с Core Data:

- NSManagedObjectContext не является потокобезопасным. Следовательно, вам необходимо ограничить доступ к этому контексту управляемого объекта, который произойдет внутри 1 потока. В противном случае у вас может быть много ошибок, которые вы не можете понять. - NSManagedObjectContext, помимо других вещей, служит как «моментальные снимки» вашего постоянного хранилища. Это означает, что когда вы меняете объект, вы сохраняете его в постоянном хранилище, вы публикуете NSManagedObjectContextDidSaveNotification, а затем вызываете mergeChangesFromContextDidSaveNotification: в другом месте внутри вашей программы, чтобы загрузить последние данные из постоянного хранилища. Будьте осторожны с безопасностью резьбы.

NSManagedObjectContext/refreshObject: mergeChanges: в соответствии с яблоком речь идет не только об обновлении управляемого объекта. Если вы передадите YES в качестве второго аргумента, он будет записывать любые ожидающие изменения из этого контекста управляемого объекта в постоянное хранилище и будет загружать любые другие изменения в другие свойства этого объекта из постоянного хранилища, таким образом, «синхронизировать» ваш объект с постоянный магазин. Если вы передадите NO в качестве второго аргумента, объект теряет все ожидающие изменения и обращается к ошибке. Это означает, что при попытке получить к нему доступ Контекст управляемого объекта перезагрузит объект, как только он был сохранен в базе данных. Он НЕ перезагружает весь контекст управляемого объекта. Он будет работать только на объекте.

Кроме того: я написал blog post, который царапает поверхность асинхронной загрузки из базы данных основных данных. В моем случае, поскольку я делаю тяжелую работу с базой данных, я в конечном итоге использовал NSOperation, который работает со своим собственным NSManagedObjectContext и использует очередные очереди GCD для сохранения больших фрагментов данных, поскольку он был быстрее, чем использование нескольких потоков для доступа к такое же постоянное хранилище, даже если они работают с различными контекстами управляемых объектов.

Надеюсь, я помог.

+0

Спасибо. Да, я использую блок-операции, и это то, о чем я говорил, когда говорил поток. Я предполагаю, что выяснение того, как NSManagedObjectContext/refreshObject: mergeChanges: работал, действительно то, чем я был. После просмотра вашего сообщения в блоге я могу пересмотреть многопоточность части ForeignKey моей синхронизации, поскольку я пытаюсь сделать это как можно более общим, а модель данных может быть довольно сложной. Я буду расчесывать его ближе позже сегодня вечером после работы. Еще раз спасибо. – yellottyellott