2013-09-11 2 views
1

В моем коде я делаю большой импорт тысяч объектов и выполняю save после каждого объекта.Основные данные: превращение объектов в неисправности после их сохранения?

Должен ли я превращать каждый объект в неисправности после сохранения его для сохранения памяти, или Core Data автоматически превратит его в неисправности? К сожалению, я не нашел никакой подсказки в Apple`s doc.

Спасибо!

ответ

1

A. Вы можете превратить объект в неисправность с помощью refreshObject:mergeChanges: (NSManagedObject). Это даст сильные ссылки на связанные объекты, чтобы они могли быть выпущены. (Если они не holded другой ссылки.)

Вы можете превратить реализованный объект в вине с refreshObject: mergeChanges: метод. Если вы передаете NO в качестве аргумента mergeChanges , вы должны быть уверены, что никаких изменений в отношениях этого объекта нет. Если есть, и вы затем сохраните контекст, вы должны будете указать проблемы ссылочной целостности в постоянном хранилище. (Link)

B. Вы можете стереть все объекты с -reset (NSManagedObjectContext) как сказал Даниэль G. Но это действительно уничтожает объекты, ссылки могут сломаться.

C. Я думаю, что нет обещания компакт-диска превратить все сохраненные объекты в неисправности. (Несвязанные объекты не могут превратиться в неисправности.) Но просто перезапишите -didTurnIntoFault (NSManagedObject), чтобы увидеть поведение CD.

+0

Нужно ли превращать объект в неисправности с помощью 'refreshObject: mergeChanges:' после того, как он был сохранен? Я думал, мне нужно 'refreshObject: mergeChanges:' только для объектов, которые я выбрал, и что вновь вставленные объекты будут автоматически освобождены/сработаны после сохранения. – AlexR

+0

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

+0

В настоящее время я превращаю объекты в ошибки после их сохранения с помощью 'refreshObject: mergeChanges:' Он работает, но я не уверен, правильно ли это это сделать или если есть рекомендация «наилучшей практики» относительно сохранения и сбоя. – AlexR

1

Я не совсем уверен, что вы просите, но если у вас много объектов, висящих в вашем контексте, вы всегда можете использовать этот метод - [NSManagedObjectContext reset], чтобы сбросить контекст и очистить память. Вы также не хотите этого делать, если у вас есть объекты, которые ссылаются на NSManagedObjects в контексте недавнего сброса.

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

Надеюсь, это поможет?

+0

Это не превращает МО в неисправность, но вытирает ее. –

+0

Извините, если мой вопрос не был достаточно ясным: (1) «Кажется, что вы должны смотреть на использование партий для ваших запросов на выборку». Я не получаю объекты из Core Data, я создаю новые объекты. Таким образом, выборка в партиях не помогла бы в моем случае. (2) '- [NSManagedObjectContext reset]' уничтожает объекты и в других контекстах. Я не могу здесь пользоваться. (3) Мой вопрос: нужно ли мне устранять/выпускать какие-либо объекты, недавно вставленные в Core Data, с помощью 'refresh:' в контексте управляемого объекта или они будут автоматически освобождаться/сбой после их сохранения? – AlexR

+0

Приношу свои извинения, теперь я понимаю. Ответ - нет, создаваемые вами объекты не будут находиться в памяти, если вы не поддерживаете ссылки на них. Для легкого чтения вы можете посмотреть документацию на Яблоки по управлению жизненным циклом объектов. https://developer.apple.com/library/ios/documentation/cocoa/conceptual/CoreData/Articles/cdMemory.html Если вы хотите принять это дальше, я бы порекомендовал смотреть эти годы. WWDC-эпизод 211 - Оптимизация и отладка производительности основных данных , его действительно стоит. Наслаждайтесь :) –

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