SlideShare a Scribd company logo
1 of 36
Download to read offline
YapDatabase
Key-Value store and Much More
Built atop SQLite for iOS & Mac
Свойства
Транзакционность
Потокобезопасность
Параллелизм
Высокая производительность
Низкое потребление памяти
Расширяемость
Современный API, построенный на блоках
Возможности
Views - Доступ к базе в стиле UITableViewDatasource и
анимация изменений
Secondary Indexes - Поиск объектов в стиле SQL
Full Text Search - Полнотекстовый поиск на базе FTS модуля
SQLite
Relationships - Механизм, похожий на deletion rules в CoreData
CloudKit - Интеграция с CloudKit (beta)
Whole Database Encryption - Обеспечивается SQLCipher
Структура доклада
Архитектура YapDatabase
Расширения, которые делают жизнь приятной
Архитектура YapDatabase
collection key data metadata
movies movie_56757 BLOB BLOB
actors actor_546 BLOB BLOB
genres genre_13 BLOB BLOB
movies movie_95456 BLOB BLOB
Схема данных хранилища
Составной primary key - collection, key
@{
@"collection_1": @{
@"key1": @[object, metadata],
@"key2": @[object, metadata],
//...
},
@"collection_2": @{
@"key1": @[object, metadata],
@"key2": @[object, metadata],
//...
}
//...
};
Структура хранилища в виде NSDictionary
Основные понятия
База данных - YapDatabase
Подключение - YapDatabaseConnection
Транзакция - YapDatabaseTransaction
YapDatabase *database = [[YapDatabase alloc] initWithPath:@"yap_db.sqlite"];
База данных (YapDatabase)
Только один экземпляр YapDatabase может иметь доступ к файлу базы.
YapDatabaseConnection *connection = [database newConnection];
Подключение (YapDatabaseConnection)
У одной базы данных может быть несколько подключений.
Транзакции
Два основных типа транзакций: YapDatabaseReadTransaction и
YapDatabaseReadWriteTransaction
SQLite транзакции + механизм snaphot & changeset
Полностью соотвествуют ACID
Snapshot & Changeset
Snapshot - 64-битное число, которое инкрементируется после
завершения каждой транзакции записи
Changeset - Структура даных, описывающая изменения,
произошедшие в транзакции
Потокобезопасность и
параллелизм
Доступ к подключениям может осуществляться из любого
потока. Потокопезопасность возвращаемых объектов не
обеспечивается базой данных.
Каждое подключение имеет свою последовательную очередь
База данных имеет глобальную последовательную очередь
для синхронизации записи
Транзакции чтения могут выполнятся параллельно
Транзакции записи выполняются последовательно и
блокируют транзакции чтения
//YapDatabaseReadTransaction - могут быть использованы только для чтения
[connection readWithBlock:^(YapDatabaseReadTransaction *transaction){
object1 = [transaction objectForKey:object1Key
inCollection:collection];
object2 = [transaction objectForKey:object2Key
inCollection:collection];
}];
//YapDatabaseReadWriteTransaction - могут быть использованы для чтения и записи
[connection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction){
object = [transaction objectForKey:objectKey
inCollection:collection];
[transaction setObject:newObject
forKey:newObjectKey inCollection:collection];
[transaction replaceObject:updatedObject
forKey:updatedObjectKey inCollection:collection];
[transaction removeObjectForKey:removedObjectKey inCollection:collection];
}];
CRUD
Хранение объектов
По умолчанию используется NSCoding
Сериализация настраивается с помощью блоков
typedef NSData* (^YapDatabaseSerializer)(NSString *collection, NSString *key, id object);
typedef id (^YapDatabaseDeserializer)(NSString *collection, NSString *key, NSData *data);
- (instancetype)initWithPath:(NSString *)path
serializer:(YapDatabaseSerializer)serializer
deserializer:(YapDatabaseDeserializer)deserializer;
- (instancetype)initWithPath:(NSString *)path
objectSerializer:(YapDatabaseSerializer)objectSerializer
objectDeserializer:(YapDatabaseDeserializer)objectDeserializer
metadataSerializer:(YapDatabaseSerializer)metadataSerializer
metadataDeserializer:(YapDatabaseDeserializer)metadataDeserializer;
Настройка сериализации
Возможности сериализации
Хранение сущностей сетевой модели данных
Большой выбор сериализаторов - Mantle, JSONModel,
Protobuf, Thrift, Fastcoding, etc
Сжатие - lz4, Snappy
Выборочное шифрование записей
Кэширование
Каждое подключение имеет отдельные LRU кэши объектов и
метаданных
Размеры кэшей могут быть настроены в процессе выполнения
Несколько политик кэширования
Политики кэширования
YapDatabasePolicyContainment - политика по умолчанию
YapDatabasePolicyCopy - требует от объектов поддержки
NSCopying
YapDatabasePolicyShare
Политики настраиваются раздельно для объектов и метаданных
Расширения
Extensions
Views
@{
@"books": @[ @[@"fiction", @"key24"],
@[@"fantasy", @"key7"],
@[@"mystery", @"key11"] ],
@"magazines": @[ @[@"gossip", @"key60"],
@[@"science", @"key49"],
@[@"travel", @"key82"] ]
};
//В виде SQL-запроса
//WHERE ... (filter)
//GROUP BY ... (group)
//ORDER BY ... (sort)
Структура в виде NSDictionary
Список упорядоченных массивов пар Collection, Key
Свойства View
Персистентность (опционально)
Автоматическое обновление
Могут быть зарегистрированы и разрегистрированы в любое
время
Транзакционность
YapDatabaseViewGrouping *grouping = nil;
YapDatabaseViewSorting *sotring = nil;
grouping = [YapDatabaseViewGrouping withRowBlock:groupingBlock];
sotring = [YapDatabaseViewSorting withRowBlock:sortingBlock];
YapDatabaseView *myView = [[YapDatabaseView alloc] initWithGrouping:grouping
sorting:sotring];
Создание и регистрация
Каждое View содержит блок фильтрации/группировки и блок
сортировки.
groupingBlock = ^NSString *(NSString *collection, NSString *key,
id object, id metadata){
if ([object isKindOfClass:[Book class]])
return @"books";
if ([object isKindOfClass:[Magazine class]])
return @"magazines";
return nil; // exclude from view
};
sortingBlock = ^NSComparisonResult (NSString *group,
NSString *collection1, NSString *key1,
id obj1, id meta1,
NSString *collection2, NSString *key2,
id obj2, id meta2){
if ([group isEqualToString:@"books"])
return [obj1 compareBookByTitleThenAuthor:obj2];
else
return [obj1 compareMagazineByMonthThenTitle:obj2];
};
Пример блоков группировки и сортировки
Существует несколько типов блоков. Отличаются они только набором
параметров, передающихся внутрь блока.
__block id objectForRow = nil;
[connection readWithBlock:^(YapDatabaseReadTransaction *transaction){
objectForRow = [[transaction ext:@"myViewName"] objectAtIndex:indexPath.row
inGroup:@"books"];
}];
//Некоторые другие методы View
(NSUInteger)numberOfGroups;
(NSArray *)allGroups;
(NSUInteger)numberOfItemsInGroup:(NSString *)group;
(NSUInteger)numberOfItemsInAllGroups;
(id)objectAtIndex:(NSUInteger)keyIndex inGroup:(NSString *)group;
Пример использования View
Анимация изменений View
YapDatabaseModifiedNotification
Long-Lived Read Transactions
Mappings
- (void)viewDidLoad
{
// ...
[connection beginLongLivedReadTransaction];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(yapDatabaseModified:)
name:YapDatabaseModifiedNotification
object:connection.database];
// ...
}
- (void)yapDatabaseModified:(NSNotification *)notification
{
YapDatabaseConnection *connection = nil;
NSArray *notifications = [connection beginLongLivedReadTransaction];
}
YapDatabaseModifiedNotification и
Long-Lived Read Transactions
//View
@{ @"bond movies": @[ @[@"movies", @"abc123"],
@[@"movies", @"xyz123"] ],
@"star wars": @[ @[@"movies", @"def456"] ],
@"batman movies": @[ @[@"movies", @"zxc567"],
@[@"movies", @"asd567"] ] };
//Mapping
//Section 0
@[ @[ @[@"movies", @"def456"] ],
//Section 1
@[ @[@"movies", @"zxc567"],
@[@"movies", @"asd567"] ],
//Section 2
@[ @[@"movies", @"abc123"],
@[@"movies", @"xyz123"] ] ];
Mappings (YapDatabaseViewMappings)
Помогает перейти от понятия group-in-a-view к section-in-a-table
- (NSUInteger)numberOfSections;
- (NSUInteger)numberOfItemsInSection:(NSUInteger)section;
- (NSString *)groupForSection:(NSUInteger)section
//Методы транзакции
- (id)objectAtIndexPath:(NSIndexPath *)indexPath
withMappings:(YapDatabaseViewMappings *)mappings;
- (id)objectAtRow:(NSUInteger)row
inSection:(NSUInteger)section
withMappings:(YapDatabaseViewMappings *)mappings;
Некоторые методы
YapDatabaseViewMappings
- (void)yapDatabaseModified:(NSNotification *)notification
{
NSArray *notifications = [connection beginLongLivedReadTransaction];
NSArray *sectionChanges = nil, *rowChanges = nil;
[[connection ext:@"movies"] getSectionChanges:&sectionChanges
rowChanges:&rowChanges
forNotifications:notifications
withMappings:mappings];
if ([sectionChanges count] == 0 & [rowChanges count] == 0){
// Nothing has changed that affects our tableView
return;
}
// Animate tableView updates ...
}
Как YapDatabaseViewMappings помогают
анимировать таблицы?
Результатом будет массив изменений секций и ячеек, которые относятся
к указанному View c применением указанного mapping-a. На их основе
уже можно легко анимировать таблицы и коллекции.
Типы Mapping-ов
Статические - набор отображаемых групп и их порядок
определяется в момент создания
Динамические - при создании указываются блоки,
определяющие видимость групп и способ их сортировки
//Статический мапинг
staticMappings = [YapDatabaseViewMappings mappingsWithGroups:@[ @"bond movies",
@"batman movies" ]
view:@"movies"];
//Можно инвертировать порядок сортировки элементов в группе
[staticMappings setIsReversed:YES forGroup:@"bond movies"];
//Динамический мапинг
YapDatabaseViewMappingGroupFilter filterBlock = nil;
YapDatabaseViewMappingGroupSort sortBlock = nil;
filterBlock = ^(NSString *group, YapDatabaseReadTransaction *transaction){
return YES; // include all movies groups
};
sortBlock = ^(NSString *group1, NSString *group2,
YapDatabaseReadTransaction *transaction){
return [group1 compare:group2]; // sorted by movie group name
};
dynamicMappings = [[YapDatabaseViewMappings alloc] initWithGroupFilterBlock:filterBlock
sortBlock:sortBlock
view:@"movies"];
Создание Mapping-ов
Дополнительные возможности
Динамические секции - если в секции нет записей, она не
отображается
Статические диапазоны - аналог LIMIT & OFFSET в SQLite
Динамические диапазоны
Зависимость ячеек - для соседних ячеек могут быть
автоматически сгенерированы события, даже если связанный
с ячейкой объект не изменился
YapDatabase и CoreData
Спасибо за внимание
Влад Ковташ
vlad@kotash.com
@VladKovtash

More Related Content

What's hot

Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)
it-park
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Глеб Тарасов
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
Python Meetup
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
e-Legion
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
Paul Stashevsky
 
Objective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантаймаObjective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантайма
Yandex
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
Dmitry Soshnikov
 

What's hot (20)

Javascript
JavascriptJavascript
Javascript
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
Talks on collections
Talks on collectionsTalks on collections
Talks on collections
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Survive with OOP
Survive with OOPSurvive with OOP
Survive with OOP
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
Objective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантаймаObjective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантайма
 
В помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаВ помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кода
 
Объекты в ECMAScript | Odessa Frontend Meetup #16
Объекты в ECMAScript | Odessa Frontend Meetup #16Объекты в ECMAScript | Odessa Frontend Meetup #16
Объекты в ECMAScript | Odessa Frontend Meetup #16
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 

Similar to Влад Ковташ — Yap Database

Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Yandex
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Глеб Тарасов
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Глеб Тарасов
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 
Knockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнKnockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-Онлайн
DevDay
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Magneta AI
 

Similar to Влад Ковташ — Yap Database (20)

Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
 
хранение данных
хранение данныххранение данных
хранение данных
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
 
Next Gen Applications
Next Gen ApplicationsNext Gen Applications
Next Gen Applications
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данных
 
iOS-05_2-UIKit
iOS-05_2-UIKitiOS-05_2-UIKit
iOS-05_2-UIKit
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
 
RDSDataSource: YapDatabase
RDSDataSource: YapDatabaseRDSDataSource: YapDatabase
RDSDataSource: YapDatabase
 
Knockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнKnockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-Онлайн
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 

More from CocoaHeads

Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений БеляевВстреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
CocoaHeads
 

More from CocoaHeads (14)

Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения МалковаДизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
 
Эффективность на рубеже UITableView — Александр Зимин
Эффективность на рубеже UITableView — Александр ЗиминЭффективность на рубеже UITableView — Александр Зимин
Эффективность на рубеже UITableView — Александр Зимин
 
Александр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOSАлександр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOS
 
UICollectionView — Александр Зимин
UICollectionView — Александр ЗиминUICollectionView — Александр Зимин
UICollectionView — Александр Зимин
 
Push Notifications
Push NotificationsPush Notifications
Push Notifications
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис ЛебедевВстреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
 
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил ПархоменкоВстреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
 
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
 
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения ПокровскаяВстреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
 
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений БеляевВстреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
 
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр КировВстреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
 
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин ПлатовВстреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
 

Влад Ковташ — Yap Database

  • 1. YapDatabase Key-Value store and Much More Built atop SQLite for iOS & Mac
  • 3. Возможности Views - Доступ к базе в стиле UITableViewDatasource и анимация изменений Secondary Indexes - Поиск объектов в стиле SQL Full Text Search - Полнотекстовый поиск на базе FTS модуля SQLite Relationships - Механизм, похожий на deletion rules в CoreData CloudKit - Интеграция с CloudKit (beta) Whole Database Encryption - Обеспечивается SQLCipher
  • 6. collection key data metadata movies movie_56757 BLOB BLOB actors actor_546 BLOB BLOB genres genre_13 BLOB BLOB movies movie_95456 BLOB BLOB Схема данных хранилища Составной primary key - collection, key
  • 7. @{ @"collection_1": @{ @"key1": @[object, metadata], @"key2": @[object, metadata], //... }, @"collection_2": @{ @"key1": @[object, metadata], @"key2": @[object, metadata], //... } //... }; Структура хранилища в виде NSDictionary
  • 8. Основные понятия База данных - YapDatabase Подключение - YapDatabaseConnection Транзакция - YapDatabaseTransaction
  • 9. YapDatabase *database = [[YapDatabase alloc] initWithPath:@"yap_db.sqlite"]; База данных (YapDatabase) Только один экземпляр YapDatabase может иметь доступ к файлу базы.
  • 10. YapDatabaseConnection *connection = [database newConnection]; Подключение (YapDatabaseConnection) У одной базы данных может быть несколько подключений.
  • 11. Транзакции Два основных типа транзакций: YapDatabaseReadTransaction и YapDatabaseReadWriteTransaction SQLite транзакции + механизм snaphot & changeset Полностью соотвествуют ACID
  • 12. Snapshot & Changeset Snapshot - 64-битное число, которое инкрементируется после завершения каждой транзакции записи Changeset - Структура даных, описывающая изменения, произошедшие в транзакции
  • 13. Потокобезопасность и параллелизм Доступ к подключениям может осуществляться из любого потока. Потокопезопасность возвращаемых объектов не обеспечивается базой данных. Каждое подключение имеет свою последовательную очередь База данных имеет глобальную последовательную очередь для синхронизации записи Транзакции чтения могут выполнятся параллельно Транзакции записи выполняются последовательно и блокируют транзакции чтения
  • 14. //YapDatabaseReadTransaction - могут быть использованы только для чтения [connection readWithBlock:^(YapDatabaseReadTransaction *transaction){ object1 = [transaction objectForKey:object1Key inCollection:collection]; object2 = [transaction objectForKey:object2Key inCollection:collection]; }]; //YapDatabaseReadWriteTransaction - могут быть использованы для чтения и записи [connection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction){ object = [transaction objectForKey:objectKey inCollection:collection]; [transaction setObject:newObject forKey:newObjectKey inCollection:collection]; [transaction replaceObject:updatedObject forKey:updatedObjectKey inCollection:collection]; [transaction removeObjectForKey:removedObjectKey inCollection:collection]; }]; CRUD
  • 15. Хранение объектов По умолчанию используется NSCoding Сериализация настраивается с помощью блоков
  • 16. typedef NSData* (^YapDatabaseSerializer)(NSString *collection, NSString *key, id object); typedef id (^YapDatabaseDeserializer)(NSString *collection, NSString *key, NSData *data); - (instancetype)initWithPath:(NSString *)path serializer:(YapDatabaseSerializer)serializer deserializer:(YapDatabaseDeserializer)deserializer; - (instancetype)initWithPath:(NSString *)path objectSerializer:(YapDatabaseSerializer)objectSerializer objectDeserializer:(YapDatabaseDeserializer)objectDeserializer metadataSerializer:(YapDatabaseSerializer)metadataSerializer metadataDeserializer:(YapDatabaseDeserializer)metadataDeserializer; Настройка сериализации
  • 17. Возможности сериализации Хранение сущностей сетевой модели данных Большой выбор сериализаторов - Mantle, JSONModel, Protobuf, Thrift, Fastcoding, etc Сжатие - lz4, Snappy Выборочное шифрование записей
  • 18. Кэширование Каждое подключение имеет отдельные LRU кэши объектов и метаданных Размеры кэшей могут быть настроены в процессе выполнения Несколько политик кэширования
  • 19. Политики кэширования YapDatabasePolicyContainment - политика по умолчанию YapDatabasePolicyCopy - требует от объектов поддержки NSCopying YapDatabasePolicyShare Политики настраиваются раздельно для объектов и метаданных
  • 21. Views
  • 22. @{ @"books": @[ @[@"fiction", @"key24"], @[@"fantasy", @"key7"], @[@"mystery", @"key11"] ], @"magazines": @[ @[@"gossip", @"key60"], @[@"science", @"key49"], @[@"travel", @"key82"] ] }; //В виде SQL-запроса //WHERE ... (filter) //GROUP BY ... (group) //ORDER BY ... (sort) Структура в виде NSDictionary Список упорядоченных массивов пар Collection, Key
  • 23. Свойства View Персистентность (опционально) Автоматическое обновление Могут быть зарегистрированы и разрегистрированы в любое время Транзакционность
  • 24. YapDatabaseViewGrouping *grouping = nil; YapDatabaseViewSorting *sotring = nil; grouping = [YapDatabaseViewGrouping withRowBlock:groupingBlock]; sotring = [YapDatabaseViewSorting withRowBlock:sortingBlock]; YapDatabaseView *myView = [[YapDatabaseView alloc] initWithGrouping:grouping sorting:sotring]; Создание и регистрация Каждое View содержит блок фильтрации/группировки и блок сортировки.
  • 25. groupingBlock = ^NSString *(NSString *collection, NSString *key, id object, id metadata){ if ([object isKindOfClass:[Book class]]) return @"books"; if ([object isKindOfClass:[Magazine class]]) return @"magazines"; return nil; // exclude from view }; sortingBlock = ^NSComparisonResult (NSString *group, NSString *collection1, NSString *key1, id obj1, id meta1, NSString *collection2, NSString *key2, id obj2, id meta2){ if ([group isEqualToString:@"books"]) return [obj1 compareBookByTitleThenAuthor:obj2]; else return [obj1 compareMagazineByMonthThenTitle:obj2]; }; Пример блоков группировки и сортировки Существует несколько типов блоков. Отличаются они только набором параметров, передающихся внутрь блока.
  • 26. __block id objectForRow = nil; [connection readWithBlock:^(YapDatabaseReadTransaction *transaction){ objectForRow = [[transaction ext:@"myViewName"] objectAtIndex:indexPath.row inGroup:@"books"]; }]; //Некоторые другие методы View (NSUInteger)numberOfGroups; (NSArray *)allGroups; (NSUInteger)numberOfItemsInGroup:(NSString *)group; (NSUInteger)numberOfItemsInAllGroups; (id)objectAtIndex:(NSUInteger)keyIndex inGroup:(NSString *)group; Пример использования View
  • 28. - (void)viewDidLoad { // ... [connection beginLongLivedReadTransaction]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yapDatabaseModified:) name:YapDatabaseModifiedNotification object:connection.database]; // ... } - (void)yapDatabaseModified:(NSNotification *)notification { YapDatabaseConnection *connection = nil; NSArray *notifications = [connection beginLongLivedReadTransaction]; } YapDatabaseModifiedNotification и Long-Lived Read Transactions
  • 29. //View @{ @"bond movies": @[ @[@"movies", @"abc123"], @[@"movies", @"xyz123"] ], @"star wars": @[ @[@"movies", @"def456"] ], @"batman movies": @[ @[@"movies", @"zxc567"], @[@"movies", @"asd567"] ] }; //Mapping //Section 0 @[ @[ @[@"movies", @"def456"] ], //Section 1 @[ @[@"movies", @"zxc567"], @[@"movies", @"asd567"] ], //Section 2 @[ @[@"movies", @"abc123"], @[@"movies", @"xyz123"] ] ]; Mappings (YapDatabaseViewMappings) Помогает перейти от понятия group-in-a-view к section-in-a-table
  • 30. - (NSUInteger)numberOfSections; - (NSUInteger)numberOfItemsInSection:(NSUInteger)section; - (NSString *)groupForSection:(NSUInteger)section //Методы транзакции - (id)objectAtIndexPath:(NSIndexPath *)indexPath withMappings:(YapDatabaseViewMappings *)mappings; - (id)objectAtRow:(NSUInteger)row inSection:(NSUInteger)section withMappings:(YapDatabaseViewMappings *)mappings; Некоторые методы YapDatabaseViewMappings
  • 31. - (void)yapDatabaseModified:(NSNotification *)notification { NSArray *notifications = [connection beginLongLivedReadTransaction]; NSArray *sectionChanges = nil, *rowChanges = nil; [[connection ext:@"movies"] getSectionChanges:&sectionChanges rowChanges:&rowChanges forNotifications:notifications withMappings:mappings]; if ([sectionChanges count] == 0 & [rowChanges count] == 0){ // Nothing has changed that affects our tableView return; } // Animate tableView updates ... } Как YapDatabaseViewMappings помогают анимировать таблицы? Результатом будет массив изменений секций и ячеек, которые относятся к указанному View c применением указанного mapping-a. На их основе уже можно легко анимировать таблицы и коллекции.
  • 32. Типы Mapping-ов Статические - набор отображаемых групп и их порядок определяется в момент создания Динамические - при создании указываются блоки, определяющие видимость групп и способ их сортировки
  • 33. //Статический мапинг staticMappings = [YapDatabaseViewMappings mappingsWithGroups:@[ @"bond movies", @"batman movies" ] view:@"movies"]; //Можно инвертировать порядок сортировки элементов в группе [staticMappings setIsReversed:YES forGroup:@"bond movies"]; //Динамический мапинг YapDatabaseViewMappingGroupFilter filterBlock = nil; YapDatabaseViewMappingGroupSort sortBlock = nil; filterBlock = ^(NSString *group, YapDatabaseReadTransaction *transaction){ return YES; // include all movies groups }; sortBlock = ^(NSString *group1, NSString *group2, YapDatabaseReadTransaction *transaction){ return [group1 compare:group2]; // sorted by movie group name }; dynamicMappings = [[YapDatabaseViewMappings alloc] initWithGroupFilterBlock:filterBlock sortBlock:sortBlock view:@"movies"]; Создание Mapping-ов
  • 34. Дополнительные возможности Динамические секции - если в секции нет записей, она не отображается Статические диапазоны - аналог LIMIT & OFFSET в SQLite Динамические диапазоны Зависимость ячеек - для соседних ячеек могут быть автоматически сгенерированы события, даже если связанный с ячейкой объект не изменился
  • 36. Спасибо за внимание Влад Ковташ vlad@kotash.com @VladKovtash