Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

RDSDataSource: YapDatabase

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
YapDatabase
Головко Михаил

YouTube-Videos werden auf SlideShare nicht mehr unterstützt.

Original auf YouTube ansehen

YapDatabase
Problem?
Wird geladen in …3
×

Hier ansehen

1 von 67 Anzeige

RDSDataSource: YapDatabase

Herunterladen, um offline zu lesen

Михаил Головко рассказал о принципах устройства и основных возможностях YapDatabase.

RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.

Михаил Головко рассказал о принципах устройства и основных возможностях YapDatabase.

RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.

Anzeige
Anzeige

Weitere Verwandte Inhalte

Andere mochten auch (15)

Ähnlich wie RDSDataSource: YapDatabase (20)

Anzeige

Weitere von RAMBLER&Co (13)

Aktuellste (20)

Anzeige

RDSDataSource: YapDatabase

  1. 1. YapDatabase Головко Михаил
  2. 2. YapDatabase Problem?
  3. 3. Рамблер Гороскопы
  4. 4. YapDatabase План • Реляционные и нереляционные БД • Хранение и работа с данными в YapDatabase • Расширения YapDatabase • YapDatabase + VIPER
  5. 5. YapDatabase Реляционная БД Реляционная база данных — это совокупность взаимосвязанных таблиц, каждая из которых содержит информацию об объектах определенного типа. Таблицы реляционной БД должны отвечать требованиям нормализации отношений.
  6. 6. YapDatabase Реляционная БД Плюсы • Нет дублирования информации • Над таблицами можно производить различные операции • Данные в таблице имеют чётко определённую структуру • Целостность данных гарантируется БД
  7. 7. YapDatabase Реляционная БД Минусы • Для получения объекта со всеми связями нужно делать сложные запросы • Нужно поддерживать базу в нормализованном виде
  8. 8. YapDatabase Реляционная БД
  9. 9. YapDatabase Нереляционная БД Хранилище типа ключ-значение. Это совокупность доменов (коллекций), каждый из которых содержит объект любого типа.
  10. 10. YapDatabase Нереляционная БД Плюсы • Динамическая модель данных, которая заранее может быть не определена • В рамках одного домена (коллекции) данные могут иметь различную структуру • Несвязанность данных
  11. 11. YapDatabase Нереляционная БД Минусы • Контроль целостности данных лежит на приложении • Избыточность данных
  12. 12. YapDatabase Нереляционная БД
  13. 13. YapDatabase YapDatabase • Нереляционная база данных (key/value) • Открытый исходный код • мм • Контрибъютит Google
  14. 14. YapDatabase Организация данных collection key object metadata sound 34 blob blob album elvis blob blob album ac/dc blob blob sound 15 blob blob sound 16 blob blob
  15. 15. YapDatabase Коллекции Sound Album Artist
  16. 16. YapDatabase Коллекции Elvis AC/DC
  17. 17. YapDatabase Коллекции Список Опубликованный Черновой
  18. 18. YapDatabase Object • Любой объект • Для сохранения объекта используется NSCoding • Можно описать свои Serializer/Deserializer
  19. 19. YapDatabase Metadata • Сохранение любой информацию • json из которого был получен объект • timestamp создания • Опциональное поле
  20. 20. YapDatabase Connection • Подключение к базе, через которое можно работать с данными • Аналог NSManagedObjectContext • Одно соединение на запись • Несколько на чтение для ui
  21. 21. YapDatabase Connection YapDatabase *database = [[YapDatabase alloc] initWithPath:path]; YapDatabaseConnection *connection = [database newConnection];
  22. 22. YapDatabase Transaction • Обеспечивают доступ к данным базы • Чтения и Записи • Синхронные и асинхронные
  23. 23. YapDatabase Connection read Transaction Connection Connection read read read read read read read read t i m e
  24. 24. YapDatabase Connection write 1 Transaction Connection Connection read read read read write 2 read write 3 read Write Queue t i m e
  25. 25. YapDatabase write 1 Connection write 1 Transaction Connection Connection read read read read write 2 read write 3 read Write Queue t i m e
  26. 26. YapDatabase Connection write 1 Transaction Connection Connection read read read read write 2 read write 3 read Write Queue write 1 write 2 t i m e
  27. 27. YapDatabase Connection write Transaction Connection Connection read read read read write 2 read write 3 read Write Queue write 1 write 1 write 2 t i m e write 3
  28. 28. YapDatabase Connection write Transaction Connection Connection read read read read write 2 read write 3 read Write Queue write 1 write 1 write 2 write 3 t i m e
  29. 29. YapDatabase Transaction • Транзакции в соединении выполняются последовательно • Все транзакции записи синхронизируются одной глобальной очередью
  30. 30. YapDatabase Transaction // Write [connection readWriteWithBlock: ^(YapDatabaseReadWriteTransaction *transaction) { [transaction setObject:@"Hello" forKey:@“World" inCollection:@"example1"]; }]; // Read [connection readWithBlock: ^(YapDatabaseReadTransaction *transaction) { NSLog(@"%@ World", [transaction objectForKey:@“World" inCollection:@"example1"]); }];
  31. 31. YapDatabase Кэширование • Используется соединениями • В зависимости от политики, различный подход к работе с объектами • Можно изменять размер и сбрасывать во время выполнения
  32. 32. YapDatabase Политики кэширования • YapDatabasePolicyContainment - объекты всегда достаются из базы • YapDatabasePolicyShare - между всеми соединениями шарятся одни экземпляры объектов • YapDatabasePolicyCopy - между соединениями объекты копируются
  33. 33. YapDatabase YapDatabaseTransaction YapDatabaseConnection Cache TransactionQueue Структура YapDatabase Serializer/Deserializer Extensions WriteQueue SQLite
  34. 34. Расширения
  35. 35. YapDatabase View • Похоже на NSFetchedResultsController • Вычисляется на этапе записи в БД • Данные группированы по коллекциям • Данные отсортированы • Данные отфильтрованы • Может содержать различные объекты • Ручное обновление данных немного сложнее, чем NSFetchedResultsController
  36. 36. YapDatabase View @{ @"books" : @[ @{@"fiction",@"key24"}, @{@"fantasy",@"key7"}, @{@"mystery",@"key11"} ], @"magazines" : @[ @{@"gossip",@"key60"}, @{@"science",@"key49"}, @{@"travel",@"key82"} ] };
  37. 37. YapDatabase View YapDatabaseViewGrouping *grouping = [YapDatabaseViewGrouping withRowBlock: ^NSString *(YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object, id metadata) { if ([object isKindOfClass:[BNBook class]]) return @"books"; return nil; }; YapDatabaseViewSorting *sorting = [YapDatabaseViewSorting withObjectBlock: ^(YapDatabaseReadTransaction *transaction, NSString *group, NSString *collection1, NSString *key1, id obj1 NSString *collection2, NSString *key2, id obj2) { return [obj1 compareBookByTitleThenAuthor:obj2]; }; YapDatabaseView *databaseView = [[YapDatabaseView alloc] initWithGrouping:grouping sorting:sorting];
  38. 38. YapDatabase Mapping (View) NSIndexPath UITableView YapDatabaseView section row group index
  39. 39. YapDatabase Mapping (View) • Настраивать список групп, их порядок • Можно реверсировать данные • Динамические и статические секции • Динамически и статически диапазон • Зависимость ячеек от другой
  40. 40. YapDatabase Mapping (View) YapDatabaseViewMappings *mappings = [YapDatabaseViewMappings mappingsWithGroups:@[@"bond movies", @"bond actors" ] view:@“myView"]; [mappings setIsDynamicSection:YES forGroup:@"bond movies”]; [mappings setIsReversed:YES forGroup:@"bond actors"];
  41. 41. YapDatabase Mapping (View) - (NSInteger)numberOfSectionsInTableView:(UITableView *)sender { return [mappings numberOfSections]; } - (NSInteger)tableView:(UITableView *)sender numberOfRowsInSection (NSInteger)section { return [mappings numberOfItemsInSection:section]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { __block id object = nil; [databaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction){ object = [[transaction ext:@"myView"] objectAtIndexPath:indexPath withMappings:mappings]; }]; // configure and return cell... }
  42. 42. YapDatabase YapDatabaseTransaction YapDatabaseConnection Cache TransactionQueue Структура YapDatabase Serializer/Deserializer Extensions WriteQueue SQLite
  43. 43. YapDatabase YapDatabaseViewMappingsYapDatabaseTransactionYapDatabaseViewTransaction YapDatabaseConnection Cache TransactionQueue Структура YapDatabase Serializer/Deserializer Extensions WriteQueue SQLite YapDatabaseExtension YapDatabaseViewConnection
  44. 44. YapDatabase FilteredViews • Позволяет фильтровать View • Поддерживает все возможности View • Динамическое изменение фильтра • Иерархия FilteredView!!!
  45. 45. YapDatabase FilteredViews YapDatabaseViewFiltering *filtering = [YapDatabaseViewFiltering withObjectBlock: ^BOOL (YapDatabaseReadTransaction *transaction, NSString *group, NSString *collection, NSString *key, id object) { return [(PhoneCall *)object isMissed]; }]; YapDatabaseFilteredView *filteredView = [[YapDatabaseFilteredView alloc] initWithParentViewName:@"view-object" filtering:filtering versionTag:@"0"];
  46. 46. YapDatabase Relationships Правила one-to-one • DeleteSourceIfDestinationDeleted • DeleteDestinationIfSourceDeleted Правила one-to-many • DeleteSourceIfAllDestinationsDeleted • DeleteDestinationIfAllSourcesDeleted
  47. 47. YapDatabase Relationships Правила уведомлений • NotifyIfSourceDeleted • NotifyIfDestinationDeleted
  48. 48. YapDatabase Relationships @implementation Player - (nullable NSArray<YapDatabaseRelationshipEdge *> *)yapDatabaseRelationshipEdges { if (avatarID == nil) return nil; YapDatabaseRelationshipEdge *edge = // (player) --> (avatar) [YapDatabaseRelationshipEdge edgeWithName:@"avatar" destinationKey:avatarID collection:@"avatars" nodeDeleteRules:YDB_DeleteDestinationIfSourceDeleted | YDB_NotifyIfDestinationDeleted]; return @[ edge ]; } - (nullable id)yapDatabaseRelationshipEdgeDeleted:(YapDatabaseRelationshipEdge *)edge withReason:(YDB_NotifyReason)reason { if ([edge.name isEqualToString:@“avatar"]) { id copy = [self copy]; copy.avatarID = nil; return copy; } return nil; }
  49. 49. YapDatabase CoreData + VIPER Interactor Service NSManagedObject Context Presenter PONSO mapping
  50. 50. YapDatabase CoreData + VIPER Interactor Service NSManagedObject Context Presenter PONSO mapping NSManagedObject
  51. 51. YapDatabase CoreData + VIPER Interactor Service NSManagedObject Context Presenter PONSO mapping NSManagedObject
  52. 52. YapDatabase CoreData + VIPER Interactor Service NSManagedObject Context Presenter PONSO mapping NSManagedObject
  53. 53. YapDatabase CoreData + VIPER Interactor Service NSManagedObject Context Presenter PONSO mapping NSManagedObject
  54. 54. YapDatabase CoreData + VIPER Interactor Service NSManagedObject Context Presenter PONSO mapping PONSO
  55. 55. YapDatabase CoreData + VIPER Interactor Service NSManagedObject Context Presenter PONSO mapping PONSO
  56. 56. YapDatabase CoreData + VIPER Interactor Service NSManagedObject Context Presenter PONSO mapping PONSO
  57. 57. YapDatabase YapDatabase + VIPER Interactor Service YapDatabase Connection Presenter
  58. 58. YapDatabase YapDatabase + VIPER Interactor Service YapDatabase Connection Presenter PONSO
  59. 59. YapDatabase YapDatabase + VIPER Interactor Service YapDatabase Connection Presenter PONSO
  60. 60. YapDatabase YapDatabase + VIPER Interactor Service YapDatabase Connection Presenter PONSO
  61. 61. YapDatabase YapDatabase + VIPER Interactor Service YapDatabase Connection Presenter PONSO
  62. 62. YapDatabase Итог Плюсы • Нет NSManagedObject • Если мы запросили данные - они точно будут • Можно оптимизировать работу с данными при помощи кэширования • Не нужна перегонка объектов из NSManagedObject в PONSO
  63. 63. YapDatabase Итог Плюсы • Объекты можно использовать в разных потоках • View с разнотипными объектами • Можно писать свои расширения !
  64. 64. YapDatabase Итог Минусы • Ручная миграция • Нет понимания работы с коллекциями • Сложная работа с relation • Все данные объекта выгружаются в памяти • Если нужны связи из других коллекций, их нужно доставать отдельно
  65. 65. Стоит попробовать в наших проектах? Да
  66. 66. Конец

×