Марк Мартемьянов, продуктовый мобильный дизайнер Aviasales: Стартап без дизайнера
#MBLTdev: Core Data: особенности использования и синхронизация...
description
Transcript of #MBLTdev: Core Data: особенности использования и синхронизация...
![Page 1: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/1.jpg)
Core Data: особенности использования и синхронизация в iCloud
Руслан ШевчукiOS-разработчик, Aviasales
![Page 2: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/2.jpg)
Road Map• Задачи, которые решаются в приложении Aviasales с помощью
Core Data
• Дизайн модели и устройство стека в приложении Aviasales
• Особенности работы с большими объемами данных, многопоточность, производительность и совместное использование данных между контекстами
• Синхронизация Core Data с помощью iCloud: сопутствующие проблемы
![Page 3: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/3.jpg)
Особенности Core Data
• Объектный граф
• Faulting
• Версионность моделей баз данных
• Поддержка KVO
• Синхронизация пользовательских данных c помощью iCloud
![Page 4: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/4.jpg)
Особенности Core Data
• Объектный граф
• Faulting
• Версионность моделей баз данных
• Поддержка KVO
• Синхронизация пользовательских данных c помощью iCloud
![Page 5: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/5.jpg)
Особенности Core Data
• Объектный граф
• Faulting
• Версионность моделей баз данных
• Поддержка KVO
• Синхронизация пользовательских данных c помощью iCloud
![Page 6: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/6.jpg)
Особенности Core Data
• Объектный граф
• Faulting
• Версионность моделей баз данных
• Поддержка KVO
• Синхронизация пользовательских данных c помощью iCloud
![Page 7: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/7.jpg)
Особенности Core Data
• Объектный граф
• Faulting
• Версионность моделей баз данных
• Поддержка KVO
• Синхронизация пользовательских данных c помощью iCloud
![Page 8: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/8.jpg)
Другие полезные функции Core Data
• Отслеживание изменений и поддержка Undo/Redo операций
• Автоматическая валидация свойств объекта
• Сложные запросы на получение данных из хранилища
• Сортировка и фильтрация
![Page 9: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/9.jpg)
Особенности Core Data
• Объектный граф
• Faulting
• Версионность моделей баз данных
• Поддержка KVO
• Синхронизация пользовательских данных c помощью iCloud
![Page 10: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/10.jpg)
Стек
NSManagedObjectContext
NSManagedObject
NSManagedObject
NSManagedObject
NSPersistantStore Coordinator
NSPesistantStore
SQLite
FileSystem
![Page 11: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/11.jpg)
Стек в приложении Aviasales
NSManagedObjectContext
NSManagedObject
NSManagedObject
NSManagedObject
NSPersistantStore Coordinator
NSPesistantStore
SQLite
FileSystem
NSManagedObjectContext
NSManagedObject
NSManagedObject
NSManagedObject
NSPersistantStore Coordinator
NSPesistantStore
In-Memory
NSManagedObjectContext
NSManagedObject
NSManagedObject
NSManagedObject
NSPersistantStore Coordinator
NSPesistantStore
iCloud
![Page 12: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/12.jpg)
Данные внутри приложения
1. Временные данные
2. Данные, которые мы хотим хранить
3. Данные, которые мы хотим синхронизировать между устройствами
3 хранилища данных – одна модель
1 2 3NSManagedObjectContext
NSManagedObject
NSManagedObject
NSManagedObject
NSPersistantStore Coordinator
NSPesistantStore
SQLite
FileSystem
NSManagedObjectContext
NSManagedObject
NSManagedObject
NSManagedObject
NSPersistantStore Coordinator
NSPesistantStore
In-Memory
NSManagedObjectContext
NSManagedObject
NSManagedObject
NSManagedObject
NSPersistantStore Coordinator
NSPesistantStore
iCloud
![Page 13: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/13.jpg)
Потоковая безопасность
NSManagedObjectContext -initWithConcurrencyType:
![Page 14: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/14.jpg)
Потоковая безопасность
NSManagedObjectContext -initWithConcurrencyType:
• NSConfinementConcurrencyType
• NSPrivateQueueConcurrencyType
• NSMainQueueConcurrencyType
![Page 15: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/15.jpg)
Сonfinement Concurrency
NSManagedObjectContext -init
• Отдельные контексты в каждом используемом потоке
• Контекст (MOC) такого типа может использоваться только в рамках потока или создавшей его очереди
• Устаревший тип контекста, тип по умолчанию для обратной совместимости
![Page 16: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/16.jpg)
Сonfinement Concurrency
NSManagedObjectContext -init
• Отдельные контексты в каждом используемом потоке
• Контекст (MOC) такого типа может использоваться только в рамках потока или создавшей его очереди
• Устаревший тип контекста, тип по умолчанию для обратной совместимости
![Page 17: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/17.jpg)
Сonfinement Concurrency
NSManagedObjectContext -init
• Отдельные контексты в каждом используемом потоке
• Контекст (MOC) такого типа может использоваться только в рамках потока или создавшей его очереди
• Устаревший тип контекста, тип по умолчанию для обратной совместимости
![Page 18: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/18.jpg)
Private QueueNSManagedObjectContext -initWithConcurrencyType:
• MOC обладает своей личной очередью
• Может использоваться только в рамках этой очереди
• При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait:
• Сore Data API может безопасно использоваться внутри блоков
![Page 19: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/19.jpg)
Private QueueNSManagedObjectContext -initWithConcurrencyType:
• MOC обладает своей личной очередью
• Может использоваться только в рамках этой очереди
• При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait:
• Сore Data API может безопасно использоваться внутри блоков
![Page 20: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/20.jpg)
Private QueueNSManagedObjectContext -initWithConcurrencyType:
• MOC обладает своей личной очередью
• Может использоваться только в рамках этой очереди
• При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait:
• Сore Data API может безопасно использоваться внутри блоков
![Page 21: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/21.jpg)
Private QueueNSManagedObjectContext -initWithConcurrencyType:
• MOC обладает своей личной очередью
• Может использоваться только в рамках этой очереди
• При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait:
• Сore Data API может безопасно использоваться внутри блоков
![Page 22: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/22.jpg)
Преимущества Private Queue над Confinement Concurrency
• MOC отвечает за доставку блока в правильную очередь
• Возможность производить операции из любого потока с помощью -performBlock: или -performBlockAndWait:
• Неиспользуемая очередь более эффективна, чем дополнительный поток
![Page 23: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/23.jpg)
Преимущества Private Queue над Confinement Concurrency
• MOC отвечает за доставку блока в правильную очередь
• Возможность производить операции из любого потока с помощью -performBlock: или -performBlockAndWait:
• Неиспользуемая очередь более эффективна, чем дополнительный поток
![Page 24: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/24.jpg)
Преимущества Private Queue над Confinement Concurrency
• MOC отвечает за доставку блока в правильную очередь
• Возможность производить операции из любого потока с помощью -performBlock: или -performBlockAndWait:
• Неиспользуемая очередь более эффективна, чем дополнительный поток
![Page 25: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/25.jpg)
Main Queue
NSManagedObjectContext -initWithConcurrencyType:
• Особености аналогичны NSPrivateQueueConcurrencyType
• Очередь всегда находится в главном потоке
• Обращение из других потоков помощью блока -performBlock:
![Page 26: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/26.jpg)
Main Queue
NSManagedObjectContext -initWithConcurrencyType:
• Особености аналогичны NSPrivateQueueConcurrencyType
• Очередь всегда находится в главном потоке
• Обращение из других потоков помощью блока -performBlock:
![Page 27: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/27.jpg)
Main Queue
NSManagedObjectContext -initWithConcurrencyType:
• Особености аналогичны NSPrivateQueueConcurrencyType
• Очередь всегда находится в главном потоке
• Обращение из других потоков c помощью блока -performBlock:
![Page 28: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/28.jpg)
Потоковая безопасность
NSManagedObjectContext -initWithConcurrencyType:
• NSConfinementConcurrencyType
• NSPrivateQueueConcurrencyType
• NSMainQueueConcurrencyType
![Page 29: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/29.jpg)
Использование Core Data с несколькими потоками
NSManagedObjectID – универсальный потокобезопасный идентификатор
• Временный
• Постоянный
![Page 30: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/30.jpg)
Использование Core Data с несколькими потоками
NSManagedObjectID – универсальный потокобезопасный идентификатор
• Временный
• Постоянный
![Page 31: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/31.jpg)
Временный NSManagedObjectID
• Временным идентификатором обладает NSManagedObject ранее никогда не попадавший в NSPersistenStore
• Невозможно получить материализацию объекта в другом контексте, используя временный идентификатор
![Page 32: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/32.jpg)
Временный NSManagedObjectID
• Временным идентификатором обладает NSManagedObject ранее никогда не попадавший в NSPersistenStore
• Невозможно получить материализацию объекта в другом контексте, используя временный идентификатор
![Page 33: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/33.jpg)
Постоянный NSManagedObjectID
• Постоянным идентификатор становится сразу после первого сохранения объекта в хранилище
• Начиная с этого момента, вы можете рематериализовать объект в другом контексте с помощью метода контекста NSManagedObjectContext -objectWithID:
• Используйте NSManagedObjectID в случае необходимости передачи объекта из одного контекста в другой
![Page 34: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/34.jpg)
Постоянный NSManagedObjectID
• Постоянным идентификатор становится сразу после первого сохранения объекта в хранилище
• Начиная с этого момента, вы можете рематериализовать объект в другом контексте с помощью метода контекста NSManagedObjectContext -objectWithID:
• Используйте NSManagedObjectID в случае необходимости передачи объекта из одного контекста в другой
![Page 35: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/35.jpg)
Постоянный NSManagedObjectID
• Постоянным идентификатор становится сразу после первого сохранения объекта в хранилище
• Начиная с этого момента, вы можете рематериализовать объект в другом контексте с помощью метода контекста NSManagedObjectContext -objectWithID:
• Используйте NSManagedObjectID в случае необходимости передачи объекта из одного контекста в другой
![Page 36: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/36.jpg)
Совместное использование несохраненных изменений между контекстами
![Page 37: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/37.jpg)
Вложенные контексты
• Совместное использование несохраненных изменений между контекстами
MOC 1 Parent
NSPersistantStore
MOC 2 Child
![Page 38: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/38.jpg)
Вложенные контексты
• Родительский контекст является для дочернего хранилищем данных
• Изменения, совершенные в дочернем контексте, при его сохранении передаются его родителю
• Возможность использовать временные NSManagedObjectID для передачи данных между вложенными контекстами
![Page 39: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/39.jpg)
Вложенные контексты
• Родительский контекст является для дочернего хранилищем данных
• Изменения, совершенные в дочернем контексте, при его сохранении передаются его родителю
• Возможность использовать временные NSManagedObjectID для передачи данных между вложенными контекстами
![Page 40: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/40.jpg)
Вложенные контексты
• Родительский контекст является для дочернего хранилищем данных
• Изменения, совершенные в дочернем контексте, при его сохранении передаются его родителю
• Возможность использовать временные NSManagedObjectID для передачи данных между вложенными контекстами
![Page 41: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/41.jpg)
Особенности вложенных контекстов• Могут использоваться для передачи несохраненных данных между вложенными контекстами
• Контекст, сохраняя изменения, передает их на один уровень выше
• Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней
• Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
![Page 42: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/42.jpg)
Особенности вложенных контекстов• Могут использоваться для передачи несохраненных данных между вложенными контекстами
• Контекст, сохраняя изменения, передает их на один уровень выше
• Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней
• Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
![Page 43: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/43.jpg)
Особенности вложенных контекстов• Могут использоваться для передачи несохраненных данных между вложенными контекстами
• Контекст, сохраняя изменения, передает их на один уровень выше
• Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней
• Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
![Page 44: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/44.jpg)
Особенности вложенных контекстов• Могут использоваться для передачи несохраненных данных между вложенными контекстами
• Контекст, сохраняя изменения, передает их на один уровень выше
• Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней
• Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
![Page 45: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/45.jpg)
iCloud Core Data
• Позволяет решить задачу синхронизации пользовательских данных
• Накладывает определенные ограничения на то, как вы будете использовать Core Data.
![Page 46: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/46.jpg)
iCloud Core Data
• Позволяет решить задачу синхронизации пользовательских данных
• Накладывает определенные ограничения на то, как вы будете использовать Core Data.
![Page 47: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/47.jpg)
iCloud Core Data
• Позволяет решить задачу синхронизации пользовательских данных
• Накладывает определенные ограничения на то, как вы будете использовать Core Data
![Page 48: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/48.jpg)
Задачи, которые решает iCloud в приложении Aviasales
• Синхронизация хранилища данных
• Авторизация пользователя и смена аккаунтов
• Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных
• Быстрый отклик системы (multi-master replication)
![Page 49: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/49.jpg)
Задачи, которые решает iCloud в приложении Aviasales
• Синхронизация хранилища данных
• Авторизация пользователя и смена аккаунтов
• Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных
• Быстрый отклик системы (multi-master replication)
![Page 50: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/50.jpg)
Задачи, которые решает iCloud в приложении Aviasales
• Синхронизация хранилища данных
• Авторизация пользователя и смена аккаунтов
• Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных
• Быстрый отклик системы (multi-master replication)
![Page 51: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/51.jpg)
Задачи, которые решает iCloud в приложении Aviasales
• Синхронизация хранилища данных
• Авторизация пользователя и смена аккаунтов
• Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных
• Быстрый отклик системы (multi-master replication)
![Page 52: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/52.jpg)
Multi-master replication
• Core Data разрешает конфликты, возникающие при параллельных изменениях данных
• Увеличение доступности всей системы в целом, то есть уменьшение времени отклика этой системы
![Page 53: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/53.jpg)
Multi-master replication
• Core Data разрешает конфликты, возникающие при параллельных изменениях данных
• Увеличение доступности всей системы в целом, то есть уменьшение времени отклика этой системы
![Page 54: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/54.jpg)
Создание хранилища данных в iCloud контейнере
• Запросить разрешения на использование iCloud в entitlements
• Передать название вашего хранилища в словаре options по ключу NSPersistentStoreUbiquitousContentNameKey
NSPersistentStoreCoordinator-addPersistentStoreWithType:configuration:URL:options:error:
![Page 55: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/55.jpg)
События iCloud
• NSPersistentStoreCoordinatorStoresWillChangeNotification
• NSPersistentStoreCoordinatorStoresDidChangeNotification
• NSPersistentStoreDidImportUbiquitousContentChangesNotification
![Page 56: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/56.jpg)
NSPersistentStoreDidImportUbiquitousContentChangesNotification
• Core Data посылает тогда, когда в ubiquity container происходят изменения извне
[[NSNotificationCenter defaultCenter] addObserverForName:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:persistentStoreCoordinator queue:queue usingBlock:^(NSNotification *note) {
[self.managedObjectContext performBlock:^{ [self.managedObjectContext mergeChangesFromContextDidSaveNotification:note]; }];
}];
![Page 57: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/57.jpg)
Изменения аккаунтов
NSPersistentStoreCoordinatorStoresWillChangeNotification//Core Data очищает хранилище данных//Блокировка UI
NSPersistentStoreCoordinatorStoresDidChangeNotification//Новые данные, соотвествующие аккаунту, попадают в хранилище//Реакция UI на изменения
![Page 58: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/58.jpg)
Изменения аккаунтов
NSPersistentStoreCoordinatorStoresWillChangeNotification//Core Data очищает хранилище данных//Блокировка UI
NSPersistentStoreCoordinatorStoresDidChangeNotification//Новые данные, соотвествующие аккаунту, попадают в хранилище//Реакция UI на изменения
![Page 59: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/59.jpg)
Edge Case №1 – Нарушение консистентности связей объектов при использовании iCloud Core Data
Появление в хранилище объекта с полностью или частично отсутствующими связанными объектами
БилетПараметры поиска
Направление
Цена
Агентство
![Page 60: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/60.jpg)
Edge Case №1 – Нарушение консистентности связей объектов при использовании iCloud Core Data
Атрибут проверки целостности объекта
БилетПараметры поиска
Направление
Цена
Агентство
![Page 61: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/61.jpg)
Edge Case №2 – Модель• Миграция на новую версию модели возможна с использованием
Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов)
• Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption
NSPersistentStoreCoordinator-addPersistentStoreWithType:configuration:URL:options:error:
• Сложные миграции iCloud Core Data не поддерживаются
• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
![Page 62: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/62.jpg)
Edge Case №2 – Модель• Миграция на новую версию модели возможна с использованием
Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов)
• Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption
NSPersistentStoreCoordinator-addPersistentStoreWithType:configuration:URL:options:error:
• Сложные миграции iCloud Core Data не поддерживаются
• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
![Page 63: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/63.jpg)
Edge Case №2 – Модель• Миграция на новую версию модели возможна с использованием
Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов)
• Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption
NSPersistentStoreCoordinator-addPersistentStoreWithType:configuration:URL:options:error:
• Сложные миграции iCloud Core Data не поддерживаются
• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
![Page 64: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/64.jpg)
Edge Case №2 – Модель• Миграция на новую версию модели возможна с использованием
Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов)
• Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption
NSPersistentStoreCoordinator-addPersistentStoreWithType:configuration:URL:options:error:
• Сложные миграции iCloud Core Data не поддерживаются
• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
![Page 65: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/65.jpg)
Edge Case №3 – Дедупликация данных
• В приложении Aviasales для каждой функциональной единицы используется специально созданный менеджер, например, JRHistoryManager, JRFavouritesManager, JRPassengersManager и т.д.
• Менеджер возвращает коллекции объектов JRSearchInfo, JRTicket, JRPassenger и отвечает за процесс дедупликации
![Page 66: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/66.jpg)
Edge Case №3 – Дедупликация данных
1. Выявление дублирующихся объектов в хранилище с помощью специально созданных хешей
2. Выбор критерия определения дубликата
3. Удаление дубликата
![Page 67: #MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)](https://reader033.fdocument.pub/reader033/viewer/2022052507/558d1a18d8b42af6058b45bd/html5/thumbnails/67.jpg)
Источники
Руслан ШевчукiOS-разработчик, [email protected]
Core Data Documentation Programming Guides, Examples, Tutorials http://developer.apple.com/
Apple Developer Forums http://devforums.apple.com
objc.io http://www.objc.io
NSHipster http://nshipster.com
MagicalRecordhttps://github.com/magicalpanda/MagicalRecord