#swift #core-data #memory-management #cloudkit
#swift #основные данные #управление памятью #cloudkit
Вопрос:
спасибо, что ответили на мой вопрос. Я работаю над приложением, которое использует оба Core Data
, и CloudKit
, когда пользователь создает объект, я сохраняю различные строки, элементы с плавающей запятой и ресурсы изображений в обоих Core Data
для быстрого локального хранения, а также в CloudKit
качестве опции резервного копирования. На всякий случай, если данные локально повреждены или пользователь переключает устройства, я хочу, чтобы они всегда могли получить доступ к данным, используемым моим приложением. В любом случае, я заметил, когда я программирую приложение для загрузки напрямую CloudKit
, минуя Core Data
хранилище, что в итоге оно использует почти в два раза больше памяти, чем при наличии локального хранилища, и ничего, что требует обновления из облака. Я всегда замечаю всплески использования памяти, которые возникают, когда я выполняю CloudKit
процесс, подобный a CKFetchRecordsOperation
или a CKQuery
, но я бы предположил, что обычно после завершения процесса память освобождается, а это не так. По сути, хранятся одни и те же данные независимо от того, извлекаются ли они из CloudKit
or Core Data
, поэтому я не понимаю, почему один выделяет намного больше памяти, чем другой. Возможно ли, что я делаю что-то не так и придерживаюсь сильных ссылок, или это общепринятый недостаток в использовании CloudKit
?
Более простым примером может быть следующий: пользователь запускает приложение, и нет никаких данных, найденных локально, с помощью Core Data
которых триггеры CloudKit
запрашивают данные, хранящиеся в облаке. Как только все данные будут извлечены и обработаны должным образом, мое приложение автоматически сохранит полученные данные Core Data
и продолжит работу. После извлечения всех данных из облака приложение теперь работает в среднем с объемом памяти 70 МБ. Если я затем закрою приложение и перезапущу его, оно обнаружит, что данные хранятся в Core Data
, а затем не будет требовать CloudKit
выборки, поэтому оно может работать в обычном режиме. Когда он работает таким образом и не выполнял никаких операций CK, он работает в среднем с объемом памяти 38 МБ.
Кто-нибудь имеет представление о том, почему это может происходить? Я бы поделился своим кодом, но я бы даже не знал, с чего начать.
Комментарии:
1. Как правило, подобный вопрос слишком широк для SO, но я понимаю, что вы ищете помощь в том, с чего начать устранение неполадок. Будет очень сложно сузить область поиска с помощью кода, работающего внутри более крупного приложения (слишком много факторов, переменных). Вы можете попробовать воссоздать с нуля очень простое приложение, которое работает с очень простыми данными и ведет себя так же, как ваше реальное приложение. Может быть, вы обнаружите, что это что-то другое, или докажете, что это CloudKit?
2. @brandonscript ~ Спасибо за ответ! Я понял, что мой вопрос был настолько расплывчатым и, вероятно, будет отклонен, поэтому я благодарю вас хотя бы за то, что вы предоставили предложения. И вы совершенно правы, что практически невозможно отследить тестирование внутри моего большого приложения. Я попробую то, что вы предложили.