Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Core Data: особенности 
использования и синхронизация в 
iCloud 
Руслан Шевчук 
iOS-разработчик, Aviasales
Road Map 
• Задачи, которые решаются в приложении Aviasales с помощью 
Core Data 
• Дизайн модели и устройство стека в при...
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация п...
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация п...
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация п...
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация п...
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация п...
Другие полезные функции Core Data 
• Отслеживание изменений и поддержка Undo/Redo операций 
• Автоматическая валидация сво...
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация п...
Стек 
NSManagedObjectContext 
NSManaged 
Object 
NSManaged 
Object 
NSManaged 
Object 
NSPersistantStore 
Coordinator 
NSP...
Стек в 
приложении 
Aviasales 
NSManagedObjectContext 
NSManaged 
Object 
NSManaged 
Object 
NSManaged 
Object 
NSPersista...
Данные внутри 
приложения 
1. Временные данные 
2. Данные, которые мы хотим хранить 
3. Данные, которые мы хотим 
синхрони...
Потоковая безопасность 
NSManagedObjectContext -initWithConcurrencyType:
Потоковая безопасность 
NSManagedObjectContext -initWithConcurrencyType: 
• NSConfinementConcurrencyType 
• NSPrivateQueue...
Сonfinement Concurrency 
NSManagedObjectContext -init 
• Отдельные контексты в каждом используемом потоке 
• Контекст (MOC...
Сonfinement Concurrency 
NSManagedObjectContext -init 
• Отдельные контексты в каждом используемом потоке 
• Контекст (MOC...
Сonfinement Concurrency 
NSManagedObjectContext -init 
• Отдельные контексты в каждом используемом потоке 
• Контекст (MOC...
Private Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• MOC обладает своей личной очередью 
• Может использоват...
Private Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• MOC обладает своей личной очередью 
• Может использоват...
Private Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• MOC обладает своей личной очередью 
• Может использоват...
Private Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• MOC обладает своей личной очередью 
• Может использоват...
Преимущества Private Queue над 
Confinement Concurrency 
• MOC отвечает за доставку блока в правильную очередь 
• Возможно...
Преимущества Private Queue над 
Confinement Concurrency 
• MOC отвечает за доставку блока в правильную очередь 
• Возможно...
Преимущества Private Queue над 
Confinement Concurrency 
• MOC отвечает за доставку блока в правильную очередь 
• Возможно...
Main Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• Особености аналогичны NSPrivateQueueConcurrencyType 
• Оче...
Main Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• Особености аналогичны NSPrivateQueueConcurrencyType 
• Оче...
Main Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• Особености аналогичны NSPrivateQueueConcurrencyType 
• Оче...
Потоковая безопасность 
NSManagedObjectContext -initWithConcurrencyType: 
• NSConfinementConcurrencyType 
• NSPrivateQueue...
Использование Core Data с несколькими 
потоками 
NSManagedObjectID – универсальный потокобезопасный 
идентификатор 
• Врем...
Использование Core Data с несколькими 
потоками 
NSManagedObjectID – универсальный потокобезопасный 
идентификатор 
• Врем...
Временный NSManagedObjectID 
• Временным идентификатором обладает NSManagedObject ранее 
никогда не попадавший в NSPersist...
Временный NSManagedObjectID 
• Временным идентификатором обладает NSManagedObject ранее 
никогда не попадавший в NSPersist...
Постоянный NSManagedObjectID 
• Постоянным идентификатор становится сразу после первого 
сохранения объекта в хранилище 
•...
Постоянный NSManagedObjectID 
• Постоянным идентификатор становится сразу после первого 
сохранения объекта в хранилище 
•...
Постоянный NSManagedObjectID 
• Постоянным идентификатор становится сразу после первого 
сохранения объекта в хранилище 
•...
Совместное использование 
несохраненных изменений между 
контекстами
Вложенные контексты 
• Совместное использование несохраненных 
изменений между контекстами 
MOC 2 
Child 
MOC 1 
Parent 
N...
Вложенные контексты 
• Родительский контекст является для дочернего хранилищем 
данных 
• Изменения, совершенные в дочерне...
Вложенные контексты 
• Родительский контекст является для дочернего хранилищем 
данных 
• Изменения, совершенные в дочерне...
Вложенные контексты 
• Родительский контекст является для дочернего хранилищем 
данных 
• Изменения, совершенные в дочерне...
Особенности вложенных контекстов 
• Могут использоваться для передачи несохраненных 
данных между вложенными контекстами 
...
Особенности вложенных контекстов 
• Могут использоваться для передачи несохраненных 
данных между вложенными контекстами 
...
Особенности вложенных контекстов 
• Могут использоваться для передачи несохраненных 
данных между вложенными контекстами 
...
Особенности вложенных контекстов 
• Могут использоваться для передачи несохраненных 
данных между вложенными контекстами 
...
iCloud Core Data 
• Позволяет решить задачу синхронизации пользовательских 
данных 
• Накладывает определенные ограничения...
iCloud Core Data 
• Позволяет решить задачу синхронизации пользовательских 
данных 
• Накладывает определенные ограничения...
iCloud Core Data 
• Позволяет решить задачу синхронизации пользовательских 
данных 
• Накладывает определенные ограничения...
Задачи, которые решает iCloud в 
приложении Aviasales 
• Синхронизация хранилища данных 
• Авторизация пользователя и смен...
Задачи, которые решает iCloud в 
приложении Aviasales 
• Синхронизация хранилища данных 
• Авторизация пользователя и смен...
Задачи, которые решает iCloud в 
приложении Aviasales 
• Синхронизация хранилища данных 
• Авторизация пользователя и смен...
Задачи, которые решает iCloud в 
приложении Aviasales 
• Синхронизация хранилища данных 
• Авторизация пользователя и смен...
Multi-master replication 
• Core Data разрешает конфликты, возникающие при 
параллельных изменениях данных 
• Увеличение д...
Multi-master replication 
• Core Data разрешает конфликты, возникающие при 
параллельных изменениях данных 
• Увеличение д...
Создание хранилища данных в iCloud 
контейнере 
• Запросить разрешения на использование iCloud в entitlements 
• Передать ...
События iCloud 
• NSPersistentStoreCoordinatorStoresWillChangeNotification 
• NSPersistentStoreCoordinatorStoresDidChangeN...
NSPersistentStoreDidImportUbiquitousContent 
ChangesNotification 
• Core Data посылает тогда, когда в ubiquity container п...
Изменения аккаунтов 
NSPersistentStoreCoordinatorStoresWillChangeNotification 
//Core Data очищает хранилище данных 
//Бло...
Изменения аккаунтов 
NSPersistentStoreCoordinatorStoresWillChangeNotification 
//Core Data очищает хранилище данных 
//Бло...
Edge Case №1 – Нарушение консистентности связей 
объектов при использовании iCloud Core Data 
Билет 
Направление 
Параметр...
Edge Case №1 – Нарушение консистентности связей 
объектов при использовании iCloud Core Data 
Билет 
Направление 
Параметр...
Edge Case №2 – Модель 
• Миграция на новую версию модели возможна с использованием 
Lightweight Migration (добавление, уда...
Edge Case №2 – Модель 
• Миграция на новую версию модели возможна с использованием 
Lightweight Migration (добавление, уда...
Edge Case №2 – Модель 
• Миграция на новую версию модели возможна с использованием 
Lightweight Migration (добавление, уда...
Edge Case №2 – Модель 
• Миграция на новую версию модели возможна с использованием 
Lightweight Migration (добавление, уда...
Edge Case №3 – Дедупликация данных 
• В приложении Aviasales для каждой функциональной единицы 
используется специально со...
Edge Case №3 – Дедупликация данных 
1. Выявление дублирующихся объектов в хранилище с помощью 
специально созданных хешей ...
Источники 
Руслан Шевчук 
iOS-разработчик, Aviasales 
ruslan@jetradar.com 
Core Data Documentation 
Programming Guides, Ex...
Upcoming SlideShare
Loading in …5
×

#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)

1,857 views

Published on

#MBLTdev: Конференция мобильных разработчиков
Спикер: Руслан Шевчук
iOS-разработчик, Aviasales
http://mbltdev.ru/

Published in: Mobile
  • Login to see the comments

#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Aviasales)

  1. 1. Core Data: особенности использования и синхронизация в iCloud Руслан Шевчук iOS-разработчик, Aviasales
  2. 2. Road Map • Задачи, которые решаются в приложении Aviasales с помощью Core Data • Дизайн модели и устройство стека в приложении Aviasales • Особенности работы с большими объемами данных, многопоточность, производительность и совместное использование данных между контекстами • Синхронизация Core Data с помощью iCloud: сопутствующие проблемы
  3. 3. Особенности Core Data • Объектный граф • Faulting • Версионность моделей баз данных • Поддержка KVO • Синхронизация пользовательских данных c помощью iCloud
  4. 4. Особенности Core Data • Объектный граф • Faulting • Версионность моделей баз данных • Поддержка KVO • Синхронизация пользовательских данных c помощью iCloud
  5. 5. Особенности Core Data • Объектный граф • Faulting • Версионность моделей баз данных • Поддержка KVO • Синхронизация пользовательских данных c помощью iCloud
  6. 6. Особенности Core Data • Объектный граф • Faulting • Версионность моделей баз данных • Поддержка KVO • Синхронизация пользовательских данных c помощью iCloud
  7. 7. Особенности Core Data • Объектный граф • Faulting • Версионность моделей баз данных • Поддержка KVO • Синхронизация пользовательских данных c помощью iCloud
  8. 8. Другие полезные функции Core Data • Отслеживание изменений и поддержка Undo/Redo операций • Автоматическая валидация свойств объекта • Сложные запросы на получение данных из хранилища • Сортировка и фильтрация
  9. 9. Особенности Core Data • Объектный граф • Faulting • Версионность моделей баз данных • Поддержка KVO • Синхронизация пользовательских данных c помощью iCloud
  10. 10. Стек NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSPersistantStore Coordinator NSPesistant Store SQLite File System
  11. 11. Стек в приложении Aviasales NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSPersistantStore Coordinator NSPesistant Store SQLite File System NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSPersistantStore Coordinator NSPesistant Store In-Memory NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSPersistantStore Coordinator NSPesistant Store iCloud
  12. 12. Данные внутри приложения 1. Временные данные 2. Данные, которые мы хотим хранить 3. Данные, которые мы хотим синхронизировать между устройствами 3 хранилища данных – одна модель 1 2 3 NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSPersistantStore Coordinator NSPesistant Store SQLite File System NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSPersistantStore Coordinator NSPesistant Store In-Memory NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSPersistantStore Coordinator NSPesistant Store iCloud
  13. 13. Потоковая безопасность NSManagedObjectContext -initWithConcurrencyType:
  14. 14. Потоковая безопасность NSManagedObjectContext -initWithConcurrencyType: • NSConfinementConcurrencyType • NSPrivateQueueConcurrencyType • NSMainQueueConcurrencyType
  15. 15. Сonfinement Concurrency NSManagedObjectContext -init • Отдельные контексты в каждом используемом потоке • Контекст (MOC) такого типа может использоваться только в рамках потока или создавшей его очереди • Устаревший тип контекста, тип по умолчанию для обратной совместимости
  16. 16. Сonfinement Concurrency NSManagedObjectContext -init • Отдельные контексты в каждом используемом потоке • Контекст (MOC) такого типа может использоваться только в рамках потока или создавшей его очереди • Устаревший тип контекста, тип по умолчанию для обратной совместимости
  17. 17. Сonfinement Concurrency NSManagedObjectContext -init • Отдельные контексты в каждом используемом потоке • Контекст (MOC) такого типа может использоваться только в рамках потока или создавшей его очереди • Устаревший тип контекста, тип по умолчанию для обратной совместимости
  18. 18. Private Queue NSManagedObjectContext -initWithConcurrencyType: • MOC обладает своей личной очередью • Может использоваться только в рамках этой очереди • При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait: • Сore Data API может безопасно использоваться внутри блоков
  19. 19. Private Queue NSManagedObjectContext -initWithConcurrencyType: • MOC обладает своей личной очередью • Может использоваться только в рамках этой очереди • При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait: • Сore Data API может безопасно использоваться внутри блоков
  20. 20. Private Queue NSManagedObjectContext -initWithConcurrencyType: • MOC обладает своей личной очередью • Может использоваться только в рамках этой очереди • При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait: • Сore Data API может безопасно использоваться внутри блоков
  21. 21. Private Queue NSManagedObjectContext -initWithConcurrencyType: • MOC обладает своей личной очередью • Может использоваться только в рамках этой очереди • При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait: • Сore Data API может безопасно использоваться внутри блоков
  22. 22. Преимущества Private Queue над Confinement Concurrency • MOC отвечает за доставку блока в правильную очередь • Возможность производить операции из любого потока с помощью -performBlock: или -performBlockAndWait: • Неиспользуемая очередь более эффективна, чем дополнительный поток
  23. 23. Преимущества Private Queue над Confinement Concurrency • MOC отвечает за доставку блока в правильную очередь • Возможность производить операции из любого потока с помощью -performBlock: или -performBlockAndWait: • Неиспользуемая очередь более эффективна, чем дополнительный поток
  24. 24. Преимущества Private Queue над Confinement Concurrency • MOC отвечает за доставку блока в правильную очередь • Возможность производить операции из любого потока с помощью -performBlock: или -performBlockAndWait: • Неиспользуемая очередь более эффективна, чем дополнительный поток
  25. 25. Main Queue NSManagedObjectContext -initWithConcurrencyType: • Особености аналогичны NSPrivateQueueConcurrencyType • Очередь всегда находится в главном потоке • Обращение из других потоков помощью блока -performBlock:
  26. 26. Main Queue NSManagedObjectContext -initWithConcurrencyType: • Особености аналогичны NSPrivateQueueConcurrencyType • Очередь всегда находится в главном потоке • Обращение из других потоков помощью блока -performBlock:
  27. 27. Main Queue NSManagedObjectContext -initWithConcurrencyType: • Особености аналогичны NSPrivateQueueConcurrencyType • Очередь всегда находится в главном потоке • Обращение из других потоков c помощью блока -performBlock:
  28. 28. Потоковая безопасность NSManagedObjectContext -initWithConcurrencyType: • NSConfinementConcurrencyType • NSPrivateQueueConcurrencyType • NSMainQueueConcurrencyType
  29. 29. Использование Core Data с несколькими потоками NSManagedObjectID – универсальный потокобезопасный идентификатор • Временный • Постоянный
  30. 30. Использование Core Data с несколькими потоками NSManagedObjectID – универсальный потокобезопасный идентификатор • Временный • Постоянный
  31. 31. Временный NSManagedObjectID • Временным идентификатором обладает NSManagedObject ранее никогда не попадавший в NSPersistenStore • Невозможно получить материализацию объекта в другом контексте, используя временный идентификатор
  32. 32. Временный NSManagedObjectID • Временным идентификатором обладает NSManagedObject ранее никогда не попадавший в NSPersistenStore • Невозможно получить материализацию объекта в другом контексте, используя временный идентификатор
  33. 33. Постоянный NSManagedObjectID • Постоянным идентификатор становится сразу после первого сохранения объекта в хранилище • Начиная с этого момента, вы можете рематериализовать объект в другом контексте с помощью метода контекста NSManagedObjectContext -objectWithID: • Используйте NSManagedObjectID в случае необходимости передачи объекта из одного контекста в другой
  34. 34. Постоянный NSManagedObjectID • Постоянным идентификатор становится сразу после первого сохранения объекта в хранилище • Начиная с этого момента, вы можете рематериализовать объект в другом контексте с помощью метода контекста NSManagedObjectContext -objectWithID: • Используйте NSManagedObjectID в случае необходимости передачи объекта из одного контекста в другой
  35. 35. Постоянный NSManagedObjectID • Постоянным идентификатор становится сразу после первого сохранения объекта в хранилище • Начиная с этого момента, вы можете рематериализовать объект в другом контексте с помощью метода контекста NSManagedObjectContext -objectWithID: • Используйте NSManagedObjectID в случае необходимости передачи объекта из одного контекста в другой
  36. 36. Совместное использование несохраненных изменений между контекстами
  37. 37. Вложенные контексты • Совместное использование несохраненных изменений между контекстами MOC 2 Child MOC 1 Parent NSPersistant Store
  38. 38. Вложенные контексты • Родительский контекст является для дочернего хранилищем данных • Изменения, совершенные в дочернем контексте, при его сохранении передаются его родителю • Возможность использовать временные NSManagedObjectID для передачи данных между вложенными контекстами
  39. 39. Вложенные контексты • Родительский контекст является для дочернего хранилищем данных • Изменения, совершенные в дочернем контексте, при его сохранении передаются его родителю • Возможность использовать временные NSManagedObjectID для передачи данных между вложенными контекстами
  40. 40. Вложенные контексты • Родительский контекст является для дочернего хранилищем данных • Изменения, совершенные в дочернем контексте, при его сохранении передаются его родителю • Возможность использовать временные NSManagedObjectID для передачи данных между вложенными контекстами
  41. 41. Особенности вложенных контекстов • Могут использоваться для передачи несохраненных данных между вложенными контекстами • Контекст, сохраняя изменения, передает их на один уровень выше • Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней • Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
  42. 42. Особенности вложенных контекстов • Могут использоваться для передачи несохраненных данных между вложенными контекстами • Контекст, сохраняя изменения, передает их на один уровень выше • Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней • Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
  43. 43. Особенности вложенных контекстов • Могут использоваться для передачи несохраненных данных между вложенными контекстами • Контекст, сохраняя изменения, передает их на один уровень выше • Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней • Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
  44. 44. Особенности вложенных контекстов • Могут использоваться для передачи несохраненных данных между вложенными контекстами • Контекст, сохраняя изменения, передает их на один уровень выше • Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней • Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
  45. 45. iCloud Core Data • Позволяет решить задачу синхронизации пользовательских данных • Накладывает определенные ограничения на то, как вы будете использовать Core Data.
  46. 46. iCloud Core Data • Позволяет решить задачу синхронизации пользовательских данных • Накладывает определенные ограничения на то, как вы будете использовать Core Data.
  47. 47. iCloud Core Data • Позволяет решить задачу синхронизации пользовательских данных • Накладывает определенные ограничения на то, как вы будете использовать Core Data
  48. 48. Задачи, которые решает iCloud в приложении Aviasales • Синхронизация хранилища данных • Авторизация пользователя и смена аккаунтов • Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных • Быстрый отклик системы (multi-master replication)
  49. 49. Задачи, которые решает iCloud в приложении Aviasales • Синхронизация хранилища данных • Авторизация пользователя и смена аккаунтов • Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных • Быстрый отклик системы (multi-master replication)
  50. 50. Задачи, которые решает iCloud в приложении Aviasales • Синхронизация хранилища данных • Авторизация пользователя и смена аккаунтов • Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных • Быстрый отклик системы (multi-master replication)
  51. 51. Задачи, которые решает iCloud в приложении Aviasales • Синхронизация хранилища данных • Авторизация пользователя и смена аккаунтов • Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных • Быстрый отклик системы (multi-master replication)
  52. 52. Multi-master replication • Core Data разрешает конфликты, возникающие при параллельных изменениях данных • Увеличение доступности всей системы в целом, то есть уменьшение времени отклика этой системы
  53. 53. Multi-master replication • Core Data разрешает конфликты, возникающие при параллельных изменениях данных • Увеличение доступности всей системы в целом, то есть уменьшение времени отклика этой системы
  54. 54. Создание хранилища данных в iCloud контейнере • Запросить разрешения на использование iCloud в entitlements • Передать название вашего хранилища в словаре options по ключу NSPersistentStoreUbiquitousContentNameKey NSPersistentStoreCoordinator -addPersistentStoreWithType:configuration:URL:options:error:
  55. 55. События iCloud • NSPersistentStoreCoordinatorStoresWillChangeNotification • NSPersistentStoreCoordinatorStoresDidChangeNotification • NSPersistentStoreDidImportUbiquitousContentChangesNotification
  56. 56. NSPersistentStoreDidImportUbiquitousContent ChangesNotification • Core Data посылает тогда, когда в ubiquity container происходят изменения извне [[NSNotificationCenter defaultCenter] addObserverForName:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:persistentStoreCoordinator queue:queue usingBlock:^(NSNotification *note) { [self.managedObjectContext performBlock:^{ [self.managedObjectContext mergeChangesFromContextDidSaveNotification:note]; }]; }];
  57. 57. Изменения аккаунтов NSPersistentStoreCoordinatorStoresWillChangeNotification //Core Data очищает хранилище данных //Блокировка UI NSPersistentStoreCoordinatorStoresDidChangeNotification //Новые данные, соотвествующие аккаунту, попадают в хранилище //Реакция UI на изменения
  58. 58. Изменения аккаунтов NSPersistentStoreCoordinatorStoresWillChangeNotification //Core Data очищает хранилище данных //Блокировка UI NSPersistentStoreCoordinatorStoresDidChangeNotification //Новые данные, соотвествующие аккаунту, попадают в хранилище //Реакция UI на изменения
  59. 59. Edge Case №1 – Нарушение консистентности связей объектов при использовании iCloud Core Data Билет Направление Параметры Агентство Появление в хранилище объекта с полностью или частично отсутствующими связанными объектами поиска Цена
  60. 60. Edge Case №1 – Нарушение консистентности связей объектов при использовании iCloud Core Data Билет Направление Параметры Агентство Атрибут проверки целостности объекта поиска Цена
  61. 61. Edge Case №2 – Модель • Миграция на новую версию модели возможна с использованием Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов) • Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption NSPersistentStoreCoordinator -addPersistentStoreWithType:configuration:URL:options:error: • Сложные миграции iCloud Core Data не поддерживаются • Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
  62. 62. Edge Case №2 – Модель • Миграция на новую версию модели возможна с использованием Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов) • Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption NSPersistentStoreCoordinator -addPersistentStoreWithType:configuration:URL:options:error: • Сложные миграции iCloud Core Data не поддерживаются • Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
  63. 63. Edge Case №2 – Модель • Миграция на новую версию модели возможна с использованием Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов) • Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption NSPersistentStoreCoordinator -addPersistentStoreWithType:configuration:URL:options:error: • Сложные миграции iCloud Core Data не поддерживаются • Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
  64. 64. Edge Case №2 – Модель • Миграция на новую версию модели возможна с использованием Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов) • Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption NSPersistentStoreCoordinator -addPersistentStoreWithType:configuration:URL:options:error: • Сложные миграции iCloud Core Data не поддерживаются • Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
  65. 65. Edge Case №3 – Дедупликация данных • В приложении Aviasales для каждой функциональной единицы используется специально созданный менеджер, например, JRHistoryManager, JRFavouritesManager, JRPassengersManager и т.д. • Менеджер возвращает коллекции объектов JRSearchInfo, JRTicket, JRPassenger и отвечает за процесс дедупликации
  66. 66. Edge Case №3 – Дедупликация данных 1. Выявление дублирующихся объектов в хранилище с помощью специально созданных хешей 2. Выбор критерия определения дубликата 3. Удаление дубликата
  67. 67. Источники Руслан Шевчук iOS-разработчик, Aviasales ruslan@jetradar.com 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 MagicalRecord https://github.com/magicalpanda/MagicalRecord

×