Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

14.02.2024

Автозберігання у SwiftData

Як писав, SwiftData дуже відрізняється від рішень зберігання даних на вебі. Сьогодні переконався ще в одній суттєвій різниці.

У SwiftData всі зміни зберігаються автоматично. Коли ти змінюєш значення поля — воно відразу заноситься в базу. Збереження відбувається, як розумію, “миттєво”, а точніше, по закінченню поточного “циклу виконання” (тобто коли контроль повертається від програми до системи).

Це, прям, змушує переосмислити свій підхід до роботи з моделлю. Наприклад, валідація має відбуватись окремо. Та створювати обʼєкти моделей можна тільки тоді, коли вони готові бути збереженими (та стати доступними в будь-якому іншому контексті.) До речі, не відразу, але знайшов офіційний посібник, який радить використовувати для форм окремі змінні, а не поля моделі.

Збереження в кінці циклу виконання надає йому неявний пакетний характер: всі зміни, зроблені за один цикл, будуть збережені разом — тож автоматичне збереження має працювати достатньо ефективно, наприклад, коли ми оновлюємо тисячу обʼєктів в циклі. Та й взагалі, так воно більш передбачувано працює: наприклад, якщо перший рядок призначає одне поле, а другий — інше, то можна бути впевненим, що збережені вони будуть разом.

Спочатку я спробував вимкнути автоматичне збереження, щоб зробити код більш звичним. Проте це працює погано. Наприклад: чомусь призначення асоціації все ж завжди зберігаються автоматично. Може, я винний, але так само ймовірно, що це якийсь баг у SwiftData. Що я розумію про Swift та все навколо нього — краще дотримуватись стандартного підходу. (А може, це гарний підхід всюди, де в тебе немає глибокого досвіду.)