Core Data: особенности 
использования и синхронизация в 
iCloud 
Руслан Шевчук 
iOS-разработчик, Aviasales
Road Map 
• Задачи, которые решаются в приложении Aviasales с помощью 
Core Data 
• Дизайн модели и устройство стека в приложении Aviasales 
• Особенности работы с большими объемами данных, 
многопоточность, производительность и совместное 
использование данных между контекстами 
• Синхронизация Core Data с помощью iCloud: сопутствующие 
проблемы
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация пользовательских данных c помощью iCloud
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация пользовательских данных c помощью iCloud
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация пользовательских данных c помощью iCloud
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация пользовательских данных c помощью iCloud
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация пользовательских данных c помощью iCloud
Другие полезные функции Core Data 
• Отслеживание изменений и поддержка Undo/Redo операций 
• Автоматическая валидация свойств объекта 
• Сложные запросы на получение данных из хранилища 
• Сортировка и фильтрация
Особенности Core Data 
• Объектный граф 
• Faulting 
• Версионность моделей баз данных 
• Поддержка KVO 
• Синхронизация пользовательских данных c помощью iCloud
Стек 
NSManagedObjectContext 
NSManaged 
Object 
NSManaged 
Object 
NSManaged 
Object 
NSPersistantStore 
Coordinator 
NSPesistant 
Store 
SQLite 
File 
System
Стек в 
приложении 
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
Данные внутри 
приложения 
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
Потоковая безопасность 
NSManagedObjectContext -initWithConcurrencyType:
Потоковая безопасность 
NSManagedObjectContext -initWithConcurrencyType: 
• NSConfinementConcurrencyType 
• NSPrivateQueueConcurrencyType 
• NSMainQueueConcurrencyType
Сonfinement Concurrency 
NSManagedObjectContext -init 
• Отдельные контексты в каждом используемом потоке 
• Контекст (MOC) такого типа может использоваться только в 
рамках потока или создавшей его очереди 
• Устаревший тип контекста, тип по умолчанию для обратной 
совместимости
Сonfinement Concurrency 
NSManagedObjectContext -init 
• Отдельные контексты в каждом используемом потоке 
• Контекст (MOC) такого типа может использоваться только в 
рамках потока или создавшей его очереди 
• Устаревший тип контекста, тип по умолчанию для обратной 
совместимости
Сonfinement Concurrency 
NSManagedObjectContext -init 
• Отдельные контексты в каждом используемом потоке 
• Контекст (MOC) такого типа может использоваться только в 
рамках потока или создавшей его очереди 
• Устаревший тип контекста, тип по умолчанию для обратной 
совместимости
Private Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• MOC обладает своей личной очередью 
• Может использоваться только в рамках этой очереди 
• При использовании контекста из других потоков предыдущее 
условие выполняется помещением задач в очередь блоками 
-performBlock: и -performBlockAndWait: 
• Сore Data API может безопасно использоваться внутри блоков
Private Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• MOC обладает своей личной очередью 
• Может использоваться только в рамках этой очереди 
• При использовании контекста из других потоков предыдущее 
условие выполняется помещением задач в очередь блоками 
-performBlock: и -performBlockAndWait: 
• Сore Data API может безопасно использоваться внутри блоков
Private Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• MOC обладает своей личной очередью 
• Может использоваться только в рамках этой очереди 
• При использовании контекста из других потоков предыдущее 
условие выполняется помещением задач в очередь блоками 
-performBlock: и -performBlockAndWait: 
• Сore Data API может безопасно использоваться внутри блоков
Private Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• MOC обладает своей личной очередью 
• Может использоваться только в рамках этой очереди 
• При использовании контекста из других потоков предыдущее 
условие выполняется помещением задач в очередь блоками 
-performBlock: и -performBlockAndWait: 
• Сore Data API может безопасно использоваться внутри блоков
Преимущества Private Queue над 
Confinement Concurrency 
• MOC отвечает за доставку блока в правильную очередь 
• Возможность производить операции из любого потока с 
помощью -performBlock: или -performBlockAndWait: 
• Неиспользуемая очередь более эффективна, чем 
дополнительный поток
Преимущества Private Queue над 
Confinement Concurrency 
• MOC отвечает за доставку блока в правильную очередь 
• Возможность производить операции из любого потока с 
помощью -performBlock: или -performBlockAndWait: 
• Неиспользуемая очередь более эффективна, чем 
дополнительный поток
Преимущества Private Queue над 
Confinement Concurrency 
• MOC отвечает за доставку блока в правильную очередь 
• Возможность производить операции из любого потока с 
помощью -performBlock: или -performBlockAndWait: 
• Неиспользуемая очередь более эффективна, чем 
дополнительный поток
Main Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• Особености аналогичны NSPrivateQueueConcurrencyType 
• Очередь всегда находится в главном потоке 
• Обращение из других потоков помощью блока -performBlock:
Main Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• Особености аналогичны NSPrivateQueueConcurrencyType 
• Очередь всегда находится в главном потоке 
• Обращение из других потоков помощью блока -performBlock:
Main Queue 
NSManagedObjectContext -initWithConcurrencyType: 
• Особености аналогичны NSPrivateQueueConcurrencyType 
• Очередь всегда находится в главном потоке 
• Обращение из других потоков c помощью блока -performBlock:
Потоковая безопасность 
NSManagedObjectContext -initWithConcurrencyType: 
• NSConfinementConcurrencyType 
• NSPrivateQueueConcurrencyType 
• NSMainQueueConcurrencyType
Использование Core Data с несколькими 
потоками 
NSManagedObjectID – универсальный потокобезопасный 
идентификатор 
• Временный 
• Постоянный
Использование Core Data с несколькими 
потоками 
NSManagedObjectID – универсальный потокобезопасный 
идентификатор 
• Временный 
• Постоянный
Временный NSManagedObjectID 
• Временным идентификатором обладает NSManagedObject ранее 
никогда не попадавший в NSPersistenStore 
• Невозможно получить материализацию объекта в другом 
контексте, используя временный идентификатор
Временный NSManagedObjectID 
• Временным идентификатором обладает NSManagedObject ранее 
никогда не попадавший в NSPersistenStore 
• Невозможно получить материализацию объекта в другом 
контексте, используя временный идентификатор
Постоянный NSManagedObjectID 
• Постоянным идентификатор становится сразу после первого 
сохранения объекта в хранилище 
• Начиная с этого момента, вы можете рематериализовать объект в 
другом контексте с помощью метода контекста 
NSManagedObjectContext -objectWithID: 
• Используйте NSManagedObjectID в случае необходимости передачи 
объекта из одного контекста в другой
Постоянный NSManagedObjectID 
• Постоянным идентификатор становится сразу после первого 
сохранения объекта в хранилище 
• Начиная с этого момента, вы можете рематериализовать объект в 
другом контексте с помощью метода контекста 
NSManagedObjectContext -objectWithID: 
• Используйте NSManagedObjectID в случае необходимости передачи 
объекта из одного контекста в другой
Постоянный NSManagedObjectID 
• Постоянным идентификатор становится сразу после первого 
сохранения объекта в хранилище 
• Начиная с этого момента, вы можете рематериализовать объект в 
другом контексте с помощью метода контекста 
NSManagedObjectContext -objectWithID: 
• Используйте NSManagedObjectID в случае необходимости передачи 
объекта из одного контекста в другой
Совместное использование 
несохраненных изменений между 
контекстами
Вложенные контексты 
• Совместное использование несохраненных 
изменений между контекстами 
MOC 2 
Child 
MOC 1 
Parent 
NSPersistant 
Store
Вложенные контексты 
• Родительский контекст является для дочернего хранилищем 
данных 
• Изменения, совершенные в дочернем контексте, при его 
сохранении передаются его родителю 
• Возможность использовать временные NSManagedObjectID для 
передачи данных между вложенными контекстами
Вложенные контексты 
• Родительский контекст является для дочернего хранилищем 
данных 
• Изменения, совершенные в дочернем контексте, при его 
сохранении передаются его родителю 
• Возможность использовать временные NSManagedObjectID для 
передачи данных между вложенными контекстами
Вложенные контексты 
• Родительский контекст является для дочернего хранилищем 
данных 
• Изменения, совершенные в дочернем контексте, при его 
сохранении передаются его родителю 
• Возможность использовать временные NSManagedObjectID для 
передачи данных между вложенными контекстами
Особенности вложенных контекстов 
• Могут использоваться для передачи несохраненных 
данных между вложенными контекстами 
• Контекст, сохраняя изменения, передает их на один уровень выше 
• Метод NSManagedObjectContext -objectWithID: вернет объект в 
том состоянии в котором сможет его обнаружить на одном из 
самых ближайших уровней 
• Родительский контекст должен иметь тип 
NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
Особенности вложенных контекстов 
• Могут использоваться для передачи несохраненных 
данных между вложенными контекстами 
• Контекст, сохраняя изменения, передает их на один уровень выше 
• Метод NSManagedObjectContext -objectWithID: вернет объект в 
том состоянии в котором сможет его обнаружить на одном из 
самых ближайших уровней 
• Родительский контекст должен иметь тип 
NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
Особенности вложенных контекстов 
• Могут использоваться для передачи несохраненных 
данных между вложенными контекстами 
• Контекст, сохраняя изменения, передает их на один уровень выше 
• Метод NSManagedObjectContext -objectWithID: вернет объект в 
том состоянии в котором сможет его обнаружить на одном из 
самых ближайших уровней 
• Родительский контекст должен иметь тип 
NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
Особенности вложенных контекстов 
• Могут использоваться для передачи несохраненных 
данных между вложенными контекстами 
• Контекст, сохраняя изменения, передает их на один уровень выше 
• Метод NSManagedObjectContext -objectWithID: вернет объект в 
том состоянии в котором сможет его обнаружить на одном из 
самых ближайших уровней 
• Родительский контекст должен иметь тип 
NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType
iCloud Core Data 
• Позволяет решить задачу синхронизации пользовательских 
данных 
• Накладывает определенные ограничения на то, как вы будете 
использовать Core Data.
iCloud Core Data 
• Позволяет решить задачу синхронизации пользовательских 
данных 
• Накладывает определенные ограничения на то, как вы будете 
использовать Core Data.
iCloud Core Data 
• Позволяет решить задачу синхронизации пользовательских 
данных 
• Накладывает определенные ограничения на то, как вы будете 
использовать Core Data
Задачи, которые решает iCloud в 
приложении Aviasales 
• Синхронизация хранилища данных 
• Авторизация пользователя и смена аккаунтов 
• Снимает необходимость в хранении пользовательских данных на 
наших серверах и разработки API для транспортировки этих 
данных 
• Быстрый отклик системы (multi-master replication)
Задачи, которые решает iCloud в 
приложении Aviasales 
• Синхронизация хранилища данных 
• Авторизация пользователя и смена аккаунтов 
• Снимает необходимость в хранении пользовательских данных на 
наших серверах и разработки API для транспортировки этих 
данных 
• Быстрый отклик системы (multi-master replication)
Задачи, которые решает iCloud в 
приложении Aviasales 
• Синхронизация хранилища данных 
• Авторизация пользователя и смена аккаунтов 
• Снимает необходимость в хранении пользовательских данных на 
наших серверах и разработки API для транспортировки этих 
данных 
• Быстрый отклик системы (multi-master replication)
Задачи, которые решает iCloud в 
приложении Aviasales 
• Синхронизация хранилища данных 
• Авторизация пользователя и смена аккаунтов 
• Снимает необходимость в хранении пользовательских данных на 
наших серверах и разработки API для транспортировки этих 
данных 
• Быстрый отклик системы (multi-master replication)
Multi-master replication 
• Core Data разрешает конфликты, возникающие при 
параллельных изменениях данных 
• Увеличение доступности всей системы в целом, то есть 
уменьшение времени отклика этой системы
Multi-master replication 
• Core Data разрешает конфликты, возникающие при 
параллельных изменениях данных 
• Увеличение доступности всей системы в целом, то есть 
уменьшение времени отклика этой системы
Создание хранилища данных в iCloud 
контейнере 
• Запросить разрешения на использование iCloud в entitlements 
• Передать название вашего хранилища в словаре options по ключу 
NSPersistentStoreUbiquitousContentNameKey 
NSPersistentStoreCoordinator 
-addPersistentStoreWithType:configuration:URL:options:error:
События iCloud 
• NSPersistentStoreCoordinatorStoresWillChangeNotification 
• NSPersistentStoreCoordinatorStoresDidChangeNotification 
• NSPersistentStoreDidImportUbiquitousContentChangesNotification
NSPersistentStoreDidImportUbiquitousContent 
ChangesNotification 
• Core Data посылает тогда, когда в ubiquity container происходят 
изменения извне 
[[NSNotificationCenter defaultCenter] 
addObserverForName:NSPersistentStoreDidImportUbiquitousContentChangesNotification 
object:persistentStoreCoordinator 
queue:queue 
usingBlock:^(NSNotification *note) { 
[self.managedObjectContext performBlock:^{ 
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:note]; 
}]; 
}];
Изменения аккаунтов 
NSPersistentStoreCoordinatorStoresWillChangeNotification 
//Core Data очищает хранилище данных 
//Блокировка UI 
NSPersistentStoreCoordinatorStoresDidChangeNotification 
//Новые данные, соотвествующие аккаунту, попадают в хранилище 
//Реакция UI на изменения
Изменения аккаунтов 
NSPersistentStoreCoordinatorStoresWillChangeNotification 
//Core Data очищает хранилище данных 
//Блокировка UI 
NSPersistentStoreCoordinatorStoresDidChangeNotification 
//Новые данные, соотвествующие аккаунту, попадают в хранилище 
//Реакция UI на изменения
Edge Case №1 – Нарушение консистентности связей 
объектов при использовании iCloud Core Data 
Билет 
Направление 
Параметры 
Агентство 
Появление в хранилище объекта с полностью или частично 
отсутствующими связанными объектами 
поиска 
Цена
Edge Case №1 – Нарушение консистентности связей 
объектов при использовании iCloud Core Data 
Билет 
Направление 
Параметры 
Агентство 
Атрибут проверки целостности объекта 
поиска 
Цена
Edge Case №2 – Модель 
• Миграция на новую версию модели возможна с использованием 
Lightweight Migration (добавление, удаление или переименовывание атрибутов, 
записей или объектов) 
• Возможность Lightweight Migration опереляется передаваемыми опциями при 
создании хранилища данных значениями @YES 
NSMigratePersistentStoresAutomaticallyOption и 
NSInferMappingModelAutomaticallyOption 
NSPersistentStoreCoordinator 
-addPersistentStoreWithType:configuration:URL:options:error: 
• Сложные миграции iCloud Core Data не поддерживаются 
• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
Edge Case №2 – Модель 
• Миграция на новую версию модели возможна с использованием 
Lightweight Migration (добавление, удаление или переименовывание атрибутов, 
записей или объектов) 
• Возможность Lightweight Migration опереляется передаваемыми опциями при 
создании хранилища данных значениями @YES 
NSMigratePersistentStoresAutomaticallyOption и 
NSInferMappingModelAutomaticallyOption 
NSPersistentStoreCoordinator 
-addPersistentStoreWithType:configuration:URL:options:error: 
• Сложные миграции iCloud Core Data не поддерживаются 
• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
Edge Case №2 – Модель 
• Миграция на новую версию модели возможна с использованием 
Lightweight Migration (добавление, удаление или переименовывание атрибутов, 
записей или объектов) 
• Возможность Lightweight Migration опереляется передаваемыми опциями при 
создании хранилища данных значениями @YES 
NSMigratePersistentStoresAutomaticallyOption и 
NSInferMappingModelAutomaticallyOption 
NSPersistentStoreCoordinator 
-addPersistentStoreWithType:configuration:URL:options:error: 
• Сложные миграции iCloud Core Data не поддерживаются 
• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
Edge Case №2 – Модель 
• Миграция на новую версию модели возможна с использованием 
Lightweight Migration (добавление, удаление или переименовывание атрибутов, 
записей или объектов) 
• Возможность Lightweight Migration опереляется передаваемыми опциями при 
создании хранилища данных значениями @YES 
NSMigratePersistentStoresAutomaticallyOption и 
NSInferMappingModelAutomaticallyOption 
NSPersistentStoreCoordinator 
-addPersistentStoreWithType:configuration:URL:options:error: 
• Сложные миграции iCloud Core Data не поддерживаются 
• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются
Edge Case №3 – Дедупликация данных 
• В приложении Aviasales для каждой функциональной единицы 
используется специально созданный менеджер, например, 
JRHistoryManager, JRFavouritesManager, JRPassengersManager и 
т.д. 
• Менеджер возвращает коллекции объектов JRSearchInfo, 
JRTicket, JRPassenger и отвечает за процесс дедупликации
Edge Case №3 – Дедупликация данных 
1. Выявление дублирующихся объектов в хранилище с помощью 
специально созданных хешей 
2. Выбор критерия определения дубликата 
3. Удаление дубликата
Источники 
Руслан Шевчук 
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

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

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