Подтвердить что ты не робот

Как часто я должен сохранять данные в Core Data?

Я работаю над приложением, поддерживаемым Core Data. Прямо сейчас я сохраняю контекст объекта как и когда добавляю или удаляю объект в контекст и из него. Боюсь, это повлияет на производительность, поэтому я думал о том, чтобы отложить сохранение. Фактически, я мог бы отложить все это до тех пор, пока приложение не закончится. Слишком рискованно сохранять данные только тогда, когда приложение вот-вот закрывается? Как часто я должен вызывать сохранение в контексте объекта?

Я думал о том, что отдельный поток обрабатывает сохранение: он будет ждать семафора. Каждый раз, когда любая часть приложения вызывает метод helper/util для сохранения основных данных, он уменьшает семафор. Когда он сбрасывается до нуля, "save thread" будет делать однократное сохранение, и он увеличивает семафор до, скажем, 5, а затем снова спящий.

Хорошая рекомендация? Спасибо!

4b9b3361

Ответ 1

Вы должны сохранять часто. Фактическая производительность операции сохранения имеет много общего с тем, какой постоянный тип хранилища вы используете. Поскольку двоичные и XML-хранилища являются атомарными, их необходимо полностью переписать на диск при каждом сохранении. По мере роста графика объекта это может замедлить работу приложения. С другой стороны, хранилище SQLite гораздо проще записывать в инкрементально. Таким образом, в то время как будут некоторые вещи, которые будут записаны выше и за пределами объектов, которые вы сохраняете, накладные расходы намного ниже, чем с типами хранилищ атомов. Сохранение, затрагивающее только несколько объектов, всегда будет быстрым, независимо от общего размера графа объекта.

Тем не менее, если вы импортируете данные в цикле, скажем, я бы подождал, пока конец всей операции не сохранит, а сохранит на каждой итерации. Ваша основная цель должна заключаться в предотвращении потери данных. (Я обнаружил, что пользователи этого не заботятся!) Производительность должна быть близкой секундой. Возможно, вам придется выполнить некоторую работу, чтобы сбалансировать частоту сбережения от производительности, но решение, которое вы начертите выше, похоже, является излишним, если вы не определили конкретную и значительную проблему с производительностью.

Ответ 2

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

Некоторые улучшения производительности, если вы добавляете много объектов, - это пакет. Добавьте все объекты в контекст, кроме сохранения. Это хорошо, например, если вы добавляете много объектов в цикл. Ваша идея схожа, но между сохранением, в котором может произойти сбой программы, может быть много времени.

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