SlideShare a Scribd company logo
UIKonf App Architecture
&
Data Oriented Design
UIKonf App & Data Driven Design @swift.berlin
+------------+ +----------------+
| | | |
| Objects | | Data |
+------------+ +----------------+
| Talk | | Title |
| Speaker | | Description |
| Organizer | | StartTime |
| Volunteer | | EndTime |
| Venue | | Name |
| Break | | TwitterHandle |
| Workshop | | PhotoURL |
| ... | | ... |
| | | |
+------------+ +----------------+
UIKonf App & Data Driven Design @swift.berlin
Time slot
[
{
"t_id": "startDay1",
"startTime": "18-09-00",
"endTime": "18-10-00",
"description": "Check in first day",
"locations": [
"Heimathafen Neukölln"
]
},
...
Organizer
...
{
"name": "Maxim Zaks",
"twitter": "@iceX33",
"bio": "Software developer with a history in IDE development,
Web development and even Enterprise Java development
(He was young and under bad influence).
Nowadays working as a game developer (preferably iOS).
Regular visitor and occasional speaker at conferences.",
"photo": "http://www.uikonf.com/static/images/maxim-zaks.png",
"organizer": true
},
...
Speaker
...
{
"name": "Graham Lee",
"twitter": "@iwasleeg",
"bio": "Graham Lee works at Facebook, where he helps people make better tests
so they can help people make better software.
In the past he worked with some other people,
and has written books and blogs so he can work
with people he hasn't met too. His blog is at sicpers.info.",
"photo": "http://www.uikonf.com/static/images/Graham-Lee.png"
},
...
Talk
...
{
"title": "World Modeling",
"speaker_name": "Mike Lee",
"t_id": "session1Day1",
"t_index": 1
},
...
Location
...
{
"name": "Heimathafen Neukölln",
"address": "Karl-Marx-Str. 141, 12043 Berlin",
"description": "Conference venue"
},
...
Import Data from JSON Array
for item in jsonArray {
let entity = context.createEntity()
for pair in (item as! NSDictionary) {
let (key,value) = (pair.key as! String,
pair.value as! JsonValue)
let component = converters[key]!(value)
entity.set(component)
}
}
What is a context?
It's a managing data structure
public class Context {
public func createEntity() -> Entity
public func destroyEntity(entity : Entity)
public func entityGroup(matcher : Matcher) -> Group
}
What's an entity?
Bag of components
Entity
public class Entity {
public func set(c:Component, overwrite:Bool = false)
public func get<C:Component>(ct:C.Type) -> C?
public func has<C:Component>(ct:C.Type) -> Bool
public func remove<C:Component>(ct:C.Type)
}
What's a component
It's just data (value object)
Components
struct NameComponent : Component, DebugPrintable {
let name : String
var debugDescription: String{
return "[(name)]"
}
}
What's a component
It also can be just a flag
struct OrganizerComponent : Component {}
UIKonf App & Data Driven Design @swift.berlin
Import Data from JSON Array
for item in jsonArray {
let entity = context.createEntity()
for pair in (item as! NSDictionary) {
let (key,value) = (pair.key as! String,
pair.value as! JsonValue)
let component = converters[key]!(value)
entity.set(component)
}
}
Converters dictionary
typealias Converter = (JsonValue) -> Component
let converters : [String : Converter] = [
"t_id" : {
TimeSlotIdComponent(id: $0 as! String)
},
"t_index" : {
TimeSlotIndexComponent(index: $0 as! Int)
},
...
How does it work with
UIKit
UIKonf App & Data Driven Design @swift.berlin
override func viewDidLoad() {
super.viewDidLoad()
groupOfEvents = context.entityGroup(
Matcher.Any(StartTimeComponent, EndTimeComponent))
setNavigationTitleFont()
groupOfEvents.addObserver(self)
context.entityGroup(
Matcher.All(RatingComponent)).addObserver(self)
readDataIntoContext(context)
syncData(context)
}
What's a group?
Subset of Entites
Entity
public class Group : SequenceType {
public var count : Int
public var sortedEntities: [Entity]
public func addObserver(observer : GroupObserver)
public func removeObserver(observer : GroupObserver)
}
UIKonf App & Data Driven Design @swift.berlin
override func viewDidLoad() {
super.viewDidLoad()
groupOfEvents = context.entityGroup(
Matcher.Any(StartTimeComponent, EndTimeComponent))
setNavigationTitleFont()
groupOfEvents.addObserver(self)
context.entityGroup(
Matcher.All(RatingComponent)).addObserver(self)
readDataIntoContext(context)
syncData(context)
}
UIKonf App & Data Driven Design @swift.berlin
extension TimeLineViewController : GroupObserver {
func entityAdded(entity : Entity) {
if entity.has(RatingComponent){
updateSendButton()
} else {
reload()
}
}
func entityRemoved(entity : Entity,
withRemovedComponent removedComponent : Component) {
if removedComponent is RatingComponent {
return
}
reload()
}
}
private lazy var reload :
dispatch_block_t = dispatch_debounce_block(0.1) {
...
}
UIKonf App & Data Driven Design @swift.berlin
UIKonf App & Data Driven Design @swift.berlin
override func tableView(tableView: UITableView,
cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let sectionName = sectionNameTable[indexPath.section]()!
let cellIdentifier = cellIdTable[sectionName]!
let cell = tableView.dequeueReusableCellWithIdentifier(
cellIdentifier, forIndexPath: indexPath) as! EntityCell
let cellEntity = cellEntityTable[sectionName]!(indexPath.row)
cell.updateWithEntity(cellEntity, context: context)
return cell as! UITableViewCell
}
protocol EntityCell {
func updateWithEntity(entity : Entity, context : Context)
}
class LocationCell: UITableViewCell, EntityCell {
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var descriptionLabel: UITextView!
func updateWithEntity(entity : Entity, context : Context){
nameLabel.text = entity.get(NameComponent)!.name
let descriptionText = entity.get(DescriptionComponent)?.description
let address = entity.get(AddressComponent)!.address
descriptionLabel.text = descriptionText != nil ?
descriptionText! + "n" + address : address
}
}
UIKonf App & Data Driven Design @swift.berlin
struct PhotoComponent : Component, DebugPrintable {
let url : NSURL
let image : UIImage
let loaded : Bool
var debugDescription: String{
return "[(url), loaded: (loaded)]"
}
}
Data:
{
...
"photo": "http://www.uikonf.com/static/images/maxim-zaks.png",
...
}
Converter:
"photo" : {
PhotoComponent(url: NSURL(string:$0 as! String)!,
image : UIImage(named:"person-icon")!, loaded: false)
},
func setPhoto() {
let photoComponent = entity!.get(PhotoComponent)!
imageView.image = photoComponent.image
if !photoComponent.loaded {
...
}
}
var detachedPerson = entity!.detach
cancelLoadingPhoto =
dispatch_after_cancellable(
0.5, dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0))
{
if let data = NSData(contentsOfURL: photoComponent.url),
let image = UIImage(data: data)
{
let photoComponent = detachedPerson.get(PhotoComponent)!
detachedPerson.set(
PhotoComponent(url: photoComponent.url,
image:image, loaded:true),
overwrite: true
)
detachedPerson.sync()
}
}
What's a detached Entity?
It's an Entity implemented as a struct
with a sync method
var detachedPerson = entity!.detach
cancelLoadingPhoto =
dispatch_after_cancellable(
0.5, dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0))
{
if let data = NSData(contentsOfURL: photoComponent.url),
let image = UIImage(data: data)
{
let photoComponent = detachedPerson.get(PhotoComponent)!
detachedPerson.set(
PhotoComponent(url: photoComponent.url,
image:image, loaded:true),
overwrite: true
)
detachedPerson.sync()
}
}
Recap
—Context is a managing Data Structure
—Entity is a bag of components
—Components are just value types
—Groups are subsets on the components
—You can observe groups -> KVO like behavior
—Use detached entity if you want to go on another
queue
Tanks you
Maxim - @iceX33
Links
—UIKonf App on Github
—Blog: Think different about Data Model
—Blog: What is an entity framework
—Book: Data oriented Design (C++ heavy)
—Talk: Data-Oriented Design and C++ (hardcore)

More Related Content

PDF
20180721 code defragment
PDF
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
PDF
MDSD for iPhone and Android
PDF
20181020 advanced higher-order function
PDF
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
PDF
6. Generics. Collections. Streams
PDF
Mozilla とブラウザゲーム
DOCX
.net progrmming part2
20180721 code defragment
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
MDSD for iPhone and Android
20181020 advanced higher-order function
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
6. Generics. Collections. Streams
Mozilla とブラウザゲーム
.net progrmming part2

What's hot (20)

PPTX
Data visualization by Kenneth Odoh
PDF
Java programs
PDF
Elm: give it a try
PDF
Unity 2018からのハイパフォーマンスな機能紹介
PDF
Cycle.js: Functional and Reactive
DOC
Oops lab manual2
PDF
Data Structures Practical File
PDF
Hive function-cheat-sheet
PDF
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
PPTX
Category theory, Monads, and Duality in the world of (BIG) Data
DOCX
2 a networkflow
PDF
Building Real Time Systems on MongoDB Using the Oplog at Stripe
PDF
An introduction to functional programming with go
PDF
Bindings: the zen of montage
PDF
The Ring programming language version 1.5.4 book - Part 42 of 185
PDF
mobl
PDF
Martin Fowler's Refactoring Techniques Quick Reference
PDF
Compositional I/O Stream in Scala
PPTX
C sharp 8
DOC
CBSE Class XII Comp sc practical file
Data visualization by Kenneth Odoh
Java programs
Elm: give it a try
Unity 2018からのハイパフォーマンスな機能紹介
Cycle.js: Functional and Reactive
Oops lab manual2
Data Structures Practical File
Hive function-cheat-sheet
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
Category theory, Monads, and Duality in the world of (BIG) Data
2 a networkflow
Building Real Time Systems on MongoDB Using the Oplog at Stripe
An introduction to functional programming with go
Bindings: the zen of montage
The Ring programming language version 1.5.4 book - Part 42 of 185
mobl
Martin Fowler's Refactoring Techniques Quick Reference
Compositional I/O Stream in Scala
C sharp 8
CBSE Class XII Comp sc practical file
Ad

Similar to UIKonf App & Data Driven Design @swift.berlin (20)

PDF
Persisting Data on SQLite using Room
PDF
resume_Alexey_Zaytsev
PPTX
Improving Correctness with Types Kats Conf
PDF
Uncommon Design Patterns
PDF
Cocoaheads Meetup / Alex Zimin / Swift magic
PDF
Александр Зимин (Alexander Zimin) — Магия Swift
PDF
Kotlin Generation
PDF
PDF
IT6801-Service Oriented Architecture-Unit-2-notes
DOCX
C# labprograms
PDF
Creating a Facebook Clone - Part XXIX - Transcript.pdf
PPTX
Improving Correctness With Type - Goto Con Berlin
PPT
OBJECTS IN Object Oriented Programming .ppt
PPT
PPT
Lo Mejor Del Pdc2008 El Futrode C#
PPTX
K is for Kotlin
PDF
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
PDF
Design for succcess with react and storybook.js
PDF
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
PPTX
Max Koretskyi "Why are Angular and React so fast?"
Persisting Data on SQLite using Room
resume_Alexey_Zaytsev
Improving Correctness with Types Kats Conf
Uncommon Design Patterns
Cocoaheads Meetup / Alex Zimin / Swift magic
Александр Зимин (Alexander Zimin) — Магия Swift
Kotlin Generation
IT6801-Service Oriented Architecture-Unit-2-notes
C# labprograms
Creating a Facebook Clone - Part XXIX - Transcript.pdf
Improving Correctness With Type - Goto Con Berlin
OBJECTS IN Object Oriented Programming .ppt
Lo Mejor Del Pdc2008 El Futrode C#
K is for Kotlin
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Design for succcess with react and storybook.js
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
Max Koretskyi "Why are Angular and React so fast?"
Ad

More from Maxim Zaks (20)

PDF
Entity Component System - a different approach to game and app development
PDF
Nitty Gritty of Data Serialisation
PDF
Wind of change
PDF
Data model mal anders
PDF
Talk Binary to Me
PDF
Entity Component System - for App developers
PDF
Beyond JSON - An Introduction to FlatBuffers
PDF
Beyond JSON @ Mobile.Warsaw
PDF
Beyond JSON @ dot swift 2016
PDF
Beyond JSON with FlatBuffers
PDF
Basics of Computer Science
PDF
Entity system architecture with Unity @Unite Europe 2015
PDF
Swift the implicit parts
PDF
Currying in Swift
PDF
Promise of an API
PDF
96% macoun 2013
PDF
Diagnose of Agile @ Wooga 04.2013
PDF
Start playing @ mobile.cologne 2013
PDF
Under Cocos2D Tree @mdvecon 2013
PDF
Don&rsquo;t do Agile, be Agile @NSConf 2013
Entity Component System - a different approach to game and app development
Nitty Gritty of Data Serialisation
Wind of change
Data model mal anders
Talk Binary to Me
Entity Component System - for App developers
Beyond JSON - An Introduction to FlatBuffers
Beyond JSON @ Mobile.Warsaw
Beyond JSON @ dot swift 2016
Beyond JSON with FlatBuffers
Basics of Computer Science
Entity system architecture with Unity @Unite Europe 2015
Swift the implicit parts
Currying in Swift
Promise of an API
96% macoun 2013
Diagnose of Agile @ Wooga 04.2013
Start playing @ mobile.cologne 2013
Under Cocos2D Tree @mdvecon 2013
Don&rsquo;t do Agile, be Agile @NSConf 2013

Recently uploaded (20)

PPTX
CH1 Production IntroductoryConcepts.pptx
PPTX
M Tech Sem 1 Civil Engineering Environmental Sciences.pptx
PPTX
UNIT-1 - COAL BASED THERMAL POWER PLANTS
PPTX
web development for engineering and engineering
PPTX
CYBER-CRIMES AND SECURITY A guide to understanding
PDF
Automation-in-Manufacturing-Chapter-Introduction.pdf
PPTX
Construction Project Organization Group 2.pptx
PPT
Project quality management in manufacturing
PDF
Operating System & Kernel Study Guide-1 - converted.pdf
PDF
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
PPT
CRASH COURSE IN ALTERNATIVE PLUMBING CLASS
PDF
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
PPTX
Engineering Ethics, Safety and Environment [Autosaved] (1).pptx
PPTX
OOP with Java - Java Introduction (Basics)
PDF
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
PPTX
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
PPT
Mechanical Engineering MATERIALS Selection
PPTX
UNIT 4 Total Quality Management .pptx
PPTX
bas. eng. economics group 4 presentation 1.pptx
PDF
R24 SURVEYING LAB MANUAL for civil enggi
CH1 Production IntroductoryConcepts.pptx
M Tech Sem 1 Civil Engineering Environmental Sciences.pptx
UNIT-1 - COAL BASED THERMAL POWER PLANTS
web development for engineering and engineering
CYBER-CRIMES AND SECURITY A guide to understanding
Automation-in-Manufacturing-Chapter-Introduction.pdf
Construction Project Organization Group 2.pptx
Project quality management in manufacturing
Operating System & Kernel Study Guide-1 - converted.pdf
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
CRASH COURSE IN ALTERNATIVE PLUMBING CLASS
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
Engineering Ethics, Safety and Environment [Autosaved] (1).pptx
OOP with Java - Java Introduction (Basics)
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
Mechanical Engineering MATERIALS Selection
UNIT 4 Total Quality Management .pptx
bas. eng. economics group 4 presentation 1.pptx
R24 SURVEYING LAB MANUAL for civil enggi

UIKonf App & Data Driven Design @swift.berlin

  • 3. +------------+ +----------------+ | | | | | Objects | | Data | +------------+ +----------------+ | Talk | | Title | | Speaker | | Description | | Organizer | | StartTime | | Volunteer | | EndTime | | Venue | | Name | | Break | | TwitterHandle | | Workshop | | PhotoURL | | ... | | ... | | | | | +------------+ +----------------+
  • 5. Time slot [ { "t_id": "startDay1", "startTime": "18-09-00", "endTime": "18-10-00", "description": "Check in first day", "locations": [ "Heimathafen Neukölln" ] }, ...
  • 6. Organizer ... { "name": "Maxim Zaks", "twitter": "@iceX33", "bio": "Software developer with a history in IDE development, Web development and even Enterprise Java development (He was young and under bad influence). Nowadays working as a game developer (preferably iOS). Regular visitor and occasional speaker at conferences.", "photo": "http://www.uikonf.com/static/images/maxim-zaks.png", "organizer": true }, ...
  • 7. Speaker ... { "name": "Graham Lee", "twitter": "@iwasleeg", "bio": "Graham Lee works at Facebook, where he helps people make better tests so they can help people make better software. In the past he worked with some other people, and has written books and blogs so he can work with people he hasn't met too. His blog is at sicpers.info.", "photo": "http://www.uikonf.com/static/images/Graham-Lee.png" }, ...
  • 8. Talk ... { "title": "World Modeling", "speaker_name": "Mike Lee", "t_id": "session1Day1", "t_index": 1 }, ...
  • 9. Location ... { "name": "Heimathafen Neukölln", "address": "Karl-Marx-Str. 141, 12043 Berlin", "description": "Conference venue" }, ...
  • 10. Import Data from JSON Array for item in jsonArray { let entity = context.createEntity() for pair in (item as! NSDictionary) { let (key,value) = (pair.key as! String, pair.value as! JsonValue) let component = converters[key]!(value) entity.set(component) } }
  • 11. What is a context? It's a managing data structure
  • 12. public class Context { public func createEntity() -> Entity public func destroyEntity(entity : Entity) public func entityGroup(matcher : Matcher) -> Group }
  • 13. What's an entity? Bag of components
  • 14. Entity public class Entity { public func set(c:Component, overwrite:Bool = false) public func get<C:Component>(ct:C.Type) -> C? public func has<C:Component>(ct:C.Type) -> Bool public func remove<C:Component>(ct:C.Type) }
  • 15. What's a component It's just data (value object)
  • 16. Components struct NameComponent : Component, DebugPrintable { let name : String var debugDescription: String{ return "[(name)]" } }
  • 17. What's a component It also can be just a flag
  • 20. Import Data from JSON Array for item in jsonArray { let entity = context.createEntity() for pair in (item as! NSDictionary) { let (key,value) = (pair.key as! String, pair.value as! JsonValue) let component = converters[key]!(value) entity.set(component) } }
  • 21. Converters dictionary typealias Converter = (JsonValue) -> Component let converters : [String : Converter] = [ "t_id" : { TimeSlotIdComponent(id: $0 as! String) }, "t_index" : { TimeSlotIndexComponent(index: $0 as! Int) }, ...
  • 22. How does it work with UIKit
  • 24. override func viewDidLoad() { super.viewDidLoad() groupOfEvents = context.entityGroup( Matcher.Any(StartTimeComponent, EndTimeComponent)) setNavigationTitleFont() groupOfEvents.addObserver(self) context.entityGroup( Matcher.All(RatingComponent)).addObserver(self) readDataIntoContext(context) syncData(context) }
  • 26. Entity public class Group : SequenceType { public var count : Int public var sortedEntities: [Entity] public func addObserver(observer : GroupObserver) public func removeObserver(observer : GroupObserver) }
  • 28. override func viewDidLoad() { super.viewDidLoad() groupOfEvents = context.entityGroup( Matcher.Any(StartTimeComponent, EndTimeComponent)) setNavigationTitleFont() groupOfEvents.addObserver(self) context.entityGroup( Matcher.All(RatingComponent)).addObserver(self) readDataIntoContext(context) syncData(context) }
  • 30. extension TimeLineViewController : GroupObserver { func entityAdded(entity : Entity) { if entity.has(RatingComponent){ updateSendButton() } else { reload() } } func entityRemoved(entity : Entity, withRemovedComponent removedComponent : Component) { if removedComponent is RatingComponent { return } reload() } }
  • 31. private lazy var reload : dispatch_block_t = dispatch_debounce_block(0.1) { ... }
  • 34. override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let sectionName = sectionNameTable[indexPath.section]()! let cellIdentifier = cellIdTable[sectionName]! let cell = tableView.dequeueReusableCellWithIdentifier( cellIdentifier, forIndexPath: indexPath) as! EntityCell let cellEntity = cellEntityTable[sectionName]!(indexPath.row) cell.updateWithEntity(cellEntity, context: context) return cell as! UITableViewCell }
  • 35. protocol EntityCell { func updateWithEntity(entity : Entity, context : Context) } class LocationCell: UITableViewCell, EntityCell { @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var descriptionLabel: UITextView! func updateWithEntity(entity : Entity, context : Context){ nameLabel.text = entity.get(NameComponent)!.name let descriptionText = entity.get(DescriptionComponent)?.description let address = entity.get(AddressComponent)!.address descriptionLabel.text = descriptionText != nil ? descriptionText! + "n" + address : address } }
  • 37. struct PhotoComponent : Component, DebugPrintable { let url : NSURL let image : UIImage let loaded : Bool var debugDescription: String{ return "[(url), loaded: (loaded)]" } }
  • 38. Data: { ... "photo": "http://www.uikonf.com/static/images/maxim-zaks.png", ... } Converter: "photo" : { PhotoComponent(url: NSURL(string:$0 as! String)!, image : UIImage(named:"person-icon")!, loaded: false) },
  • 39. func setPhoto() { let photoComponent = entity!.get(PhotoComponent)! imageView.image = photoComponent.image if !photoComponent.loaded { ... } }
  • 40. var detachedPerson = entity!.detach cancelLoadingPhoto = dispatch_after_cancellable( 0.5, dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) { if let data = NSData(contentsOfURL: photoComponent.url), let image = UIImage(data: data) { let photoComponent = detachedPerson.get(PhotoComponent)! detachedPerson.set( PhotoComponent(url: photoComponent.url, image:image, loaded:true), overwrite: true ) detachedPerson.sync() } }
  • 41. What's a detached Entity? It's an Entity implemented as a struct with a sync method
  • 42. var detachedPerson = entity!.detach cancelLoadingPhoto = dispatch_after_cancellable( 0.5, dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) { if let data = NSData(contentsOfURL: photoComponent.url), let image = UIImage(data: data) { let photoComponent = detachedPerson.get(PhotoComponent)! detachedPerson.set( PhotoComponent(url: photoComponent.url, image:image, loaded:true), overwrite: true ) detachedPerson.sync() } }
  • 43. Recap —Context is a managing Data Structure —Entity is a bag of components —Components are just value types —Groups are subsets on the components —You can observe groups -> KVO like behavior —Use detached entity if you want to go on another queue
  • 44. Tanks you Maxim - @iceX33
  • 45. Links —UIKonf App on Github —Blog: Think different about Data Model —Blog: What is an entity framework —Book: Data oriented Design (C++ heavy) —Talk: Data-Oriented Design and C++ (hardcore)