#mbltdev: core data: особенности использования и синхронизация...

67
Core Data: особенности использования и синхронизация в iCloud Руслан Шевчук iOS-разработчик, Aviasales

Upload: e-legion

Post on 26-Jun-2015

851 views

Category:

Mobile


1 download

DESCRIPTION

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

TRANSCRIPT

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

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

Руслан ШевчукiOS-разработчик, Aviasales

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

Road Map• Задачи, которые решаются в приложении Aviasales с помощью

Core Data

• Дизайн модели и устройство стека в приложении Aviasales

• Особенности работы с большими объемами данных, многопоточность, производительность и совместное использование данных между контекстами

• Синхронизация Core Data с помощью iCloud: сопутствующие проблемы

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

Особенности Core Data

• Объектный граф

• Faulting

• Версионность моделей баз данных

• Поддержка KVO

• Синхронизация пользовательских данных c помощью iCloud

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

Особенности Core Data

• Объектный граф

• Faulting

• Версионность моделей баз данных

• Поддержка KVO

• Синхронизация пользовательских данных c помощью iCloud

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

Особенности Core Data

• Объектный граф

• Faulting

• Версионность моделей баз данных

• Поддержка KVO

• Синхронизация пользовательских данных c помощью iCloud

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

Особенности Core Data

• Объектный граф

• Faulting

• Версионность моделей баз данных

• Поддержка KVO

• Синхронизация пользовательских данных c помощью iCloud

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

Особенности Core Data

• Объектный граф

• Faulting

• Версионность моделей баз данных

• Поддержка KVO

• Синхронизация пользовательских данных c помощью iCloud

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

Другие полезные функции Core Data

• Отслеживание изменений и поддержка Undo/Redo операций

• Автоматическая валидация свойств объекта

• Сложные запросы на получение данных из хранилища

• Сортировка и фильтрация

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

Особенности Core Data

• Объектный граф

• Faulting

• Версионность моделей баз данных

• Поддержка KVO

• Синхронизация пользовательских данных c помощью iCloud

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

Стек

NSManagedObjectContext

NSManagedObject

NSManagedObject

NSManagedObject

NSPersistantStore Coordinator

NSPesistantStore

SQLite

FileSystem

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

Стек в приложении Aviasales

NSManagedObjectContext

NSManagedObject

NSManagedObject

NSManagedObject

NSPersistantStore Coordinator

NSPesistantStore

SQLite

FileSystem

NSManagedObjectContext

NSManagedObject

NSManagedObject

NSManagedObject

NSPersistantStore Coordinator

NSPesistantStore

In-Memory

NSManagedObjectContext

NSManagedObject

NSManagedObject

NSManagedObject

NSPersistantStore Coordinator

NSPesistantStore

iCloud

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

Данные внутри приложения

1. Временные данные

2. Данные, которые мы хотим хранить

3. Данные, которые мы хотим синхронизировать между устройствами

3 хранилища данных – одна модель

1 2 3NSManagedObjectContext

NSManagedObject

NSManagedObject

NSManagedObject

NSPersistantStore Coordinator

NSPesistantStore

SQLite

FileSystem

NSManagedObjectContext

NSManagedObject

NSManagedObject

NSManagedObject

NSPersistantStore Coordinator

NSPesistantStore

In-Memory

NSManagedObjectContext

NSManagedObject

NSManagedObject

NSManagedObject

NSPersistantStore Coordinator

NSPesistantStore

iCloud

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

Потоковая безопасность

NSManagedObjectContext -initWithConcurrencyType:

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

Потоковая безопасность

NSManagedObjectContext -initWithConcurrencyType:

• NSConfinementConcurrencyType

• NSPrivateQueueConcurrencyType

• NSMainQueueConcurrencyType

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

Сonfinement Concurrency

NSManagedObjectContext -init

• Отдельные контексты в каждом используемом потоке

• Контекст (MOC) такого типа может использоваться только в рамках потока или создавшей его очереди

• Устаревший тип контекста, тип по умолчанию для обратной совместимости

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

Сonfinement Concurrency

NSManagedObjectContext -init

• Отдельные контексты в каждом используемом потоке

• Контекст (MOC) такого типа может использоваться только в рамках потока или создавшей его очереди

• Устаревший тип контекста, тип по умолчанию для обратной совместимости

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

Сonfinement Concurrency

NSManagedObjectContext -init

• Отдельные контексты в каждом используемом потоке

• Контекст (MOC) такого типа может использоваться только в рамках потока или создавшей его очереди

• Устаревший тип контекста, тип по умолчанию для обратной совместимости

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

Private QueueNSManagedObjectContext -initWithConcurrencyType:

• MOC обладает своей личной очередью

• Может использоваться только в рамках этой очереди

• При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait:

• Сore Data API может безопасно использоваться внутри блоков

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

Private QueueNSManagedObjectContext -initWithConcurrencyType:

• MOC обладает своей личной очередью

• Может использоваться только в рамках этой очереди

• При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait:

• Сore Data API может безопасно использоваться внутри блоков

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

Private QueueNSManagedObjectContext -initWithConcurrencyType:

• MOC обладает своей личной очередью

• Может использоваться только в рамках этой очереди

• При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait:

• Сore Data API может безопасно использоваться внутри блоков

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

Private QueueNSManagedObjectContext -initWithConcurrencyType:

• MOC обладает своей личной очередью

• Может использоваться только в рамках этой очереди

• При использовании контекста из других потоков предыдущее условие выполняется помещением задач в очередь блоками -performBlock: и -performBlockAndWait:

• Сore Data API может безопасно использоваться внутри блоков

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

Преимущества Private Queue над Confinement Concurrency

• MOC отвечает за доставку блока в правильную очередь

• Возможность производить операции из любого потока с помощью -performBlock: или -performBlockAndWait:

• Неиспользуемая очередь более эффективна, чем дополнительный поток

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

Преимущества Private Queue над Confinement Concurrency

• MOC отвечает за доставку блока в правильную очередь

• Возможность производить операции из любого потока с помощью -performBlock: или -performBlockAndWait:

• Неиспользуемая очередь более эффективна, чем дополнительный поток

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

Преимущества Private Queue над Confinement Concurrency

• MOC отвечает за доставку блока в правильную очередь

• Возможность производить операции из любого потока с помощью -performBlock: или -performBlockAndWait:

• Неиспользуемая очередь более эффективна, чем дополнительный поток

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

Main Queue

NSManagedObjectContext -initWithConcurrencyType:

• Особености аналогичны NSPrivateQueueConcurrencyType

• Очередь всегда находится в главном потоке

• Обращение из других потоков помощью блока -performBlock:

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

Main Queue

NSManagedObjectContext -initWithConcurrencyType:

• Особености аналогичны NSPrivateQueueConcurrencyType

• Очередь всегда находится в главном потоке

• Обращение из других потоков помощью блока -performBlock:

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

Main Queue

NSManagedObjectContext -initWithConcurrencyType:

• Особености аналогичны NSPrivateQueueConcurrencyType

• Очередь всегда находится в главном потоке

• Обращение из других потоков c помощью блока -performBlock:

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

Потоковая безопасность

NSManagedObjectContext -initWithConcurrencyType:

• NSConfinementConcurrencyType

• NSPrivateQueueConcurrencyType

• NSMainQueueConcurrencyType

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

Использование Core Data с несколькими потоками

NSManagedObjectID – универсальный потокобезопасный идентификатор

• Временный

• Постоянный

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

Использование Core Data с несколькими потоками

NSManagedObjectID – универсальный потокобезопасный идентификатор

• Временный

• Постоянный

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

Временный NSManagedObjectID

• Временным идентификатором обладает NSManagedObject ранее никогда не попадавший в NSPersistenStore

• Невозможно получить материализацию объекта в другом контексте, используя временный идентификатор

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

Временный NSManagedObjectID

• Временным идентификатором обладает NSManagedObject ранее никогда не попадавший в NSPersistenStore

• Невозможно получить материализацию объекта в другом контексте, используя временный идентификатор

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

Постоянный NSManagedObjectID

• Постоянным идентификатор становится сразу после первого сохранения объекта в хранилище

• Начиная с этого момента, вы можете рематериализовать объект в другом контексте с помощью метода контекста NSManagedObjectContext -objectWithID:

• Используйте NSManagedObjectID в случае необходимости передачи объекта из одного контекста в другой

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

Постоянный NSManagedObjectID

• Постоянным идентификатор становится сразу после первого сохранения объекта в хранилище

• Начиная с этого момента, вы можете рематериализовать объект в другом контексте с помощью метода контекста NSManagedObjectContext -objectWithID:

• Используйте NSManagedObjectID в случае необходимости передачи объекта из одного контекста в другой

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

Постоянный NSManagedObjectID

• Постоянным идентификатор становится сразу после первого сохранения объекта в хранилище

• Начиная с этого момента, вы можете рематериализовать объект в другом контексте с помощью метода контекста NSManagedObjectContext -objectWithID:

• Используйте NSManagedObjectID в случае необходимости передачи объекта из одного контекста в другой

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

Совместное использование несохраненных изменений между контекстами

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

Вложенные контексты

• Совместное использование несохраненных изменений между контекстами

MOC 1 Parent

NSPersistantStore

MOC 2 Child

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

Вложенные контексты

• Родительский контекст является для дочернего хранилищем данных

• Изменения, совершенные в дочернем контексте, при его сохранении передаются его родителю

• Возможность использовать временные NSManagedObjectID для передачи данных между вложенными контекстами

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

Вложенные контексты

• Родительский контекст является для дочернего хранилищем данных

• Изменения, совершенные в дочернем контексте, при его сохранении передаются его родителю

• Возможность использовать временные NSManagedObjectID для передачи данных между вложенными контекстами

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

Вложенные контексты

• Родительский контекст является для дочернего хранилищем данных

• Изменения, совершенные в дочернем контексте, при его сохранении передаются его родителю

• Возможность использовать временные NSManagedObjectID для передачи данных между вложенными контекстами

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

Особенности вложенных контекстов• Могут использоваться для передачи несохраненных данных между вложенными контекстами

• Контекст, сохраняя изменения, передает их на один уровень выше

• Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней

• Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType

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

Особенности вложенных контекстов• Могут использоваться для передачи несохраненных данных между вложенными контекстами

• Контекст, сохраняя изменения, передает их на один уровень выше

• Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней

• Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType

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

Особенности вложенных контекстов• Могут использоваться для передачи несохраненных данных между вложенными контекстами

• Контекст, сохраняя изменения, передает их на один уровень выше

• Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней

• Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType

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

Особенности вложенных контекстов• Могут использоваться для передачи несохраненных данных между вложенными контекстами

• Контекст, сохраняя изменения, передает их на один уровень выше

• Метод NSManagedObjectContext -objectWithID: вернет объект в том состоянии в котором сможет его обнаружить на одном из самых ближайших уровней

• Родительский контекст должен иметь тип NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType

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

iCloud Core Data

• Позволяет решить задачу синхронизации пользовательских данных

• Накладывает определенные ограничения на то, как вы будете использовать Core Data.

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

iCloud Core Data

• Позволяет решить задачу синхронизации пользовательских данных

• Накладывает определенные ограничения на то, как вы будете использовать Core Data.

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

iCloud Core Data

• Позволяет решить задачу синхронизации пользовательских данных

• Накладывает определенные ограничения на то, как вы будете использовать Core Data

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

Задачи, которые решает iCloud в приложении Aviasales

• Синхронизация хранилища данных

• Авторизация пользователя и смена аккаунтов

• Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных

• Быстрый отклик системы (multi-master replication)

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

Задачи, которые решает iCloud в приложении Aviasales

• Синхронизация хранилища данных

• Авторизация пользователя и смена аккаунтов

• Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных

• Быстрый отклик системы (multi-master replication)

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

Задачи, которые решает iCloud в приложении Aviasales

• Синхронизация хранилища данных

• Авторизация пользователя и смена аккаунтов

• Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных

• Быстрый отклик системы (multi-master replication)

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

Задачи, которые решает iCloud в приложении Aviasales

• Синхронизация хранилища данных

• Авторизация пользователя и смена аккаунтов

• Снимает необходимость в хранении пользовательских данных на наших серверах и разработки API для транспортировки этих данных

• Быстрый отклик системы (multi-master replication)

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

Multi-master replication

• Core Data разрешает конфликты, возникающие при параллельных изменениях данных

• Увеличение доступности всей системы в целом, то есть уменьшение времени отклика этой системы

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

Multi-master replication

• Core Data разрешает конфликты, возникающие при параллельных изменениях данных

• Увеличение доступности всей системы в целом, то есть уменьшение времени отклика этой системы

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

Создание хранилища данных в iCloud контейнере

• Запросить разрешения на использование iCloud в entitlements

• Передать название вашего хранилища в словаре options по ключу NSPersistentStoreUbiquitousContentNameKey

NSPersistentStoreCoordinator-addPersistentStoreWithType:configuration:URL:options:error:

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

События iCloud

• NSPersistentStoreCoordinatorStoresWillChangeNotification

• NSPersistentStoreCoordinatorStoresDidChangeNotification

• NSPersistentStoreDidImportUbiquitousContentChangesNotification

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

NSPersistentStoreDidImportUbiquitousContentChangesNotification

• Core Data посылает тогда, когда в ubiquity container происходят изменения извне

[[NSNotificationCenter defaultCenter] addObserverForName:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:persistentStoreCoordinator queue:queue usingBlock:^(NSNotification *note) {

[self.managedObjectContext performBlock:^{ [self.managedObjectContext mergeChangesFromContextDidSaveNotification:note]; }];

}];

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

Изменения аккаунтов

NSPersistentStoreCoordinatorStoresWillChangeNotification//Core Data очищает хранилище данных//Блокировка UI

NSPersistentStoreCoordinatorStoresDidChangeNotification//Новые данные, соотвествующие аккаунту, попадают в хранилище//Реакция UI на изменения

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

Изменения аккаунтов

NSPersistentStoreCoordinatorStoresWillChangeNotification//Core Data очищает хранилище данных//Блокировка UI

NSPersistentStoreCoordinatorStoresDidChangeNotification//Новые данные, соотвествующие аккаунту, попадают в хранилище//Реакция UI на изменения

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

Edge Case №1 – Нарушение консистентности связей объектов при использовании iCloud Core Data

Появление в хранилище объекта с полностью или частично отсутствующими связанными объектами

БилетПараметры поиска

Направление

Цена

Агентство

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

Edge Case №1 – Нарушение консистентности связей объектов при использовании iCloud Core Data

Атрибут проверки целостности объекта

БилетПараметры поиска

Направление

Цена

Агентство

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

Edge Case №2 – Модель• Миграция на новую версию модели возможна с использованием

Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов)

• Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption

NSPersistentStoreCoordinator-addPersistentStoreWithType:configuration:URL:options:error:

• Сложные миграции iCloud Core Data не поддерживаются

• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются

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

Edge Case №2 – Модель• Миграция на новую версию модели возможна с использованием

Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов)

• Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption

NSPersistentStoreCoordinator-addPersistentStoreWithType:configuration:URL:options:error:

• Сложные миграции iCloud Core Data не поддерживаются

• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются

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

Edge Case №2 – Модель• Миграция на новую версию модели возможна с использованием

Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов)

• Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption

NSPersistentStoreCoordinator-addPersistentStoreWithType:configuration:URL:options:error:

• Сложные миграции iCloud Core Data не поддерживаются

• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются

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

Edge Case №2 – Модель• Миграция на новую версию модели возможна с использованием

Lightweight Migration (добавление, удаление или переименовывание атрибутов, записей или объектов)

• Возможность Lightweight Migration опереляется передаваемыми опциями при создании хранилища данных значениями @YES NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption

NSPersistentStoreCoordinator-addPersistentStoreWithType:configuration:URL:options:error:

• Сложные миграции iCloud Core Data не поддерживаются

• Упорядоченные связи to-many (NSOrderedSet) не поддерживаются

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

Edge Case №3 – Дедупликация данных

• В приложении Aviasales для каждой функциональной единицы используется специально созданный менеджер, например, JRHistoryManager, JRFavouritesManager, JRPassengersManager и т.д.

• Менеджер возвращает коллекции объектов JRSearchInfo, JRTicket, JRPassenger и отвечает за процесс дедупликации

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

Edge Case №3 – Дедупликация данных

1. Выявление дублирующихся объектов в хранилище с помощью специально созданных хешей

2. Выбор критерия определения дубликата

3. Удаление дубликата

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

Источники

Руслан ШевчукiOS-разработчик, [email protected]

Core Data Documentation Programming Guides, Examples, Tutorials http://developer.apple.com/

Apple Developer Forums http://devforums.apple.com

objc.io http://www.objc.io

NSHipster http://nshipster.com

MagicalRecordhttps://github.com/magicalpanda/MagicalRecord