SlideShare a Scribd company logo
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

More Related Content

What's hot

Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассниках
odnoklassniki.ru
 
андрей паньгин
андрей паньгинандрей паньгин
андрей паньгинkuchinskaya
 
Mysql replication DevConf 2012
Mysql replication DevConf 2012Mysql replication DevConf 2012
Mysql replication DevConf 2012Alex Chistyakov
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Ontico
 
Инфраструктура от IBM Cloud: Как создать собственное частное облако на VMware...
Инфраструктура от IBM Cloud: Как создать собственное частное облако на VMware...Инфраструктура от IBM Cloud: Как создать собственное частное облако на VMware...
Инфраструктура от IBM Cloud: Как создать собственное частное облако на VMware...
Dinar Garipov
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Dmytro Mindra
 
SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101
Nadzeya Pus
 
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелитьсяСинхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
MODX Беларусь
 
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
Ontico
 
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Ontico
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
e-Legion
 
RAD на Java: как устроена CUBA Platform?
RAD на Java: как устроена  CUBA Platform?RAD на Java: как устроена  CUBA Platform?
RAD на Java: как устроена CUBA Platform?
Aleksey Stukalov
 
Сравнительный анализ хранилищ данных, Олег Царев, Кирилл Коринский
Сравнительный анализ хранилищ данных, Олег Царев, Кирилл КоринскийСравнительный анализ хранилищ данных, Олег Царев, Кирилл Коринский
Сравнительный анализ хранилищ данных, Олег Царев, Кирилл КоринскийFuenteovejuna
 
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Ontico
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
Denis Shestakov
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
Alex Chistyakov
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Ontico
 

What's hot (20)

Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассниках
 
андрей паньгин
андрей паньгинандрей паньгин
андрей паньгин
 
Mysql replication DevConf 2012
Mysql replication DevConf 2012Mysql replication DevConf 2012
Mysql replication DevConf 2012
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
 
Инфраструктура от IBM Cloud: Как создать собственное частное облако на VMware...
Инфраструктура от IBM Cloud: Как создать собственное частное облако на VMware...Инфраструктура от IBM Cloud: Как создать собственное частное облако на VMware...
Инфраструктура от IBM Cloud: Как создать собственное частное облако на VMware...
 
Webcluster cases
Webcluster casesWebcluster cases
Webcluster cases
 
1c bitrix-cluster-et
1c bitrix-cluster-et1c bitrix-cluster-et
1c bitrix-cluster-et
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
 
SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101
 
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелитьсяСинхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
 
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
 
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
RAD на Java: как устроена CUBA Platform?
RAD на Java: как устроена  CUBA Platform?RAD на Java: как устроена  CUBA Platform?
RAD на Java: как устроена CUBA Platform?
 
Zabbix v2
Zabbix v2Zabbix v2
Zabbix v2
 
Сравнительный анализ хранилищ данных, Олег Царев, Кирилл Коринский
Сравнительный анализ хранилищ данных, Олег Царев, Кирилл КоринскийСравнительный анализ хранилищ данных, Олег Царев, Кирилл Коринский
Сравнительный анализ хранилищ данных, Олег Царев, Кирилл Коринский
 
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
 

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

ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
Pavel Tsukanov
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
Расширяем горизонты с помощью iCloud
Расширяем горизонты с помощью iCloudРасширяем горизонты с помощью iCloud
Расширяем горизонты с помощью iCloud
ru_Parallels
 
MBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, ParallelsMBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, Parallels
e-Legion
 
Приватный клауд на базе OpenStack
Приватный клауд на базе OpenStackПриватный клауд на базе OpenStack
Приватный клауд на базе OpenStack
Ilya Alekseyev
 
What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012InTRUEdeR
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
buranLcme
 
Александр Шаповал «Контейнеры Windows в Microsoft Azure и on-premise»
Александр Шаповал «Контейнеры Windows в Microsoft Azure и on-premise»Александр Шаповал «Контейнеры Windows в Microsoft Azure и on-premise»
Александр Шаповал «Контейнеры Windows в Microsoft Azure и on-premise»
SpbDotNet Community
 
Курс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. SpringКурс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. Spring
7bits
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Swift School #3
Swift School #3Swift School #3
Swift School #3
Sergey Pronin
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Ontico
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
Vasya Petrov
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
Igor Shkulipa
 
Александр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.comАлександр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.com
Ontico
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Yandex
 
Дмитрий Лазаренко-«Живая миграция и отказоустойчивость контейнеров в гибридно...
Дмитрий Лазаренко-«Живая миграция и отказоустойчивость контейнеров в гибридно...Дмитрий Лазаренко-«Живая миграция и отказоустойчивость контейнеров в гибридно...
Дмитрий Лазаренко-«Живая миграция и отказоустойчивость контейнеров в гибридно...
Tanya Denisyuk
 
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва  Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
it-people
 
Docker Containers orchestrators: Kubernetes vs. Swarm
Docker Containers orchestrators: Kubernetes vs. SwarmDocker Containers orchestrators: Kubernetes vs. Swarm
Docker Containers orchestrators: Kubernetes vs. Swarm
Dmitry Lazarenko
 
Android - 13 - Database
Android - 13 - DatabaseAndroid - 13 - Database
Android - 13 - Database
Noveo
 

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

ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
Расширяем горизонты с помощью iCloud
Расширяем горизонты с помощью iCloudРасширяем горизонты с помощью iCloud
Расширяем горизонты с помощью iCloud
 
MBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, ParallelsMBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, Parallels
 
Приватный клауд на базе OpenStack
Приватный клауд на базе OpenStackПриватный клауд на базе OpenStack
Приватный клауд на базе OpenStack
 
What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
 
Александр Шаповал «Контейнеры Windows в Microsoft Azure и on-premise»
Александр Шаповал «Контейнеры Windows в Microsoft Azure и on-premise»Александр Шаповал «Контейнеры Windows в Microsoft Azure и on-premise»
Александр Шаповал «Контейнеры Windows в Microsoft Azure и on-premise»
 
Курс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. SpringКурс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. Spring
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Swift School #3
Swift School #3Swift School #3
Swift School #3
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
 
Александр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.comАлександр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.com
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Дмитрий Лазаренко-«Живая миграция и отказоустойчивость контейнеров в гибридно...
Дмитрий Лазаренко-«Живая миграция и отказоустойчивость контейнеров в гибридно...Дмитрий Лазаренко-«Живая миграция и отказоустойчивость контейнеров в гибридно...
Дмитрий Лазаренко-«Живая миграция и отказоустойчивость контейнеров в гибридно...
 
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва  Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 
Docker Containers orchestrators: Kubernetes vs. Swarm
Docker Containers orchestrators: Kubernetes vs. SwarmDocker Containers orchestrators: Kubernetes vs. Swarm
Docker Containers orchestrators: Kubernetes vs. Swarm
 
Android - 13 - Database
Android - 13 - DatabaseAndroid - 13 - Database
Android - 13 - Database
 

More from e-Legion

MBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, PureMBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, Pure
e-Legion
 
MBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetricaMBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetrica
e-Legion
 
MBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba MobileMBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba Mobile
e-Legion
 
MBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha RestoranyMBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha Restorany
e-Legion
 
MBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500StartupsMBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500Startups
e-Legion
 
MBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, AviasalesMBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, Aviasales
e-Legion
 
MBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank OnlineMBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank Online
e-Legion
 
Rx Java architecture
Rx Java architectureRx Java architecture
Rx Java architecture
e-Legion
 
Rx java
Rx javaRx java
Rx java
e-Legion
 
MBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, SpotifyMBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, Spotify
e-Legion
 
MBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, WunderlistMBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, Wunderlist
e-Legion
 
MBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, SoundcloudMBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, Soundcloud
e-Legion
 
MBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&CoMBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&Co
e-Legion
 
MBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, PostforpostMBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, Postforpost
e-Legion
 
MBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DITMBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DIT
e-Legion
 
MBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, LitresMBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, Litres
e-Legion
 
MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box
e-Legion
 
MBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, MicrosoftMBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, Microsoft
e-Legion
 
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
e-Legion
 
MBLTDev15: Ivan Kozlov, Aviasales
MBLTDev15: Ivan Kozlov, AviasalesMBLTDev15: Ivan Kozlov, Aviasales
MBLTDev15: Ivan Kozlov, Aviasales
e-Legion
 

More from e-Legion (20)

MBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, PureMBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, Pure
 
MBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetricaMBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetrica
 
MBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba MobileMBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba Mobile
 
MBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha RestoranyMBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha Restorany
 
MBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500StartupsMBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500Startups
 
MBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, AviasalesMBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, Aviasales
 
MBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank OnlineMBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank Online
 
Rx Java architecture
Rx Java architectureRx Java architecture
Rx Java architecture
 
Rx java
Rx javaRx java
Rx java
 
MBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, SpotifyMBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, Spotify
 
MBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, WunderlistMBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, Wunderlist
 
MBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, SoundcloudMBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, Soundcloud
 
MBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&CoMBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&Co
 
MBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, PostforpostMBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, Postforpost
 
MBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DITMBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DIT
 
MBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, LitresMBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, Litres
 
MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box
 
MBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, MicrosoftMBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, Microsoft
 
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
 
MBLTDev15: Ivan Kozlov, Aviasales
MBLTDev15: Ivan Kozlov, AviasalesMBLTDev15: Ivan Kozlov, Aviasales
MBLTDev15: Ivan Kozlov, Aviasales
 

#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
  • 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