Если размер файла значительно превышает объем данных, которые вы храните, вероятно, вы столкнулись с проблемой version pinning.
Версия pinning - это когда экземпляр Realm
находится вокруг намного дольше, чем ожидалось, в то время как другие потоки записывают новые данные. Экземпляр A Realm
сохраняет в памяти версию данных, которые она просматривает, пока она не будет освобождена или обновлена до последней версии. Если один поток записывает данные в Realm, а другой поток имеет экземпляр Realm
, открытый в более старой версии, новые данные не могут перезаписывать старые, и поэтому размер файла заканчивается. Когда экземпляр Realm
освобождается или продвигается к текущей версии, пространство для более старых версий в файле Realm помечено как свободное и может быть повторно использовано для последующей записи.
Общей ситуацией, которая может привести к закреплению версии, является использование Realm в очередях отправки, а экземпляр Realm
попадает в пул автоопределения очереди отправки. Очереди диспетчеризации истощают свои пулы авторефератов относительно редко, что может привести к тому, что срок действия экземпляра Realm
будет значительно дольше, чем вы могли ожидать. Чтобы избежать этого класса проблем, мы предлагаем, чтобы вся работа с Realm в диспетчерских очередях была явно завершена в пулы автозапуска. Это обеспечит своевременное предоставление экземпляров Realm
.
Вы не закрываете свой экземпляр Realm в фоновом потоке. Вы можете * использовать несколько транзакций вместо одной транзакции. – EpicPandaForce
@EpicPandaForce вы отчасти правы. Я действительно использовал несколько транзакций, но, насколько мне известно, нет возможности закрыть экземпляр области в swift – TheKringar
@EpicPandaForce Не могли бы вы объяснить мне, почему размер становится таким большим и таким случайным в этом случае. Потому что, поскольку я думал, что это не имеет значения, пишу ли я в нескольких транзакциях или просто в одном? – TheKringar