SlideShare una empresa de Scribd logo
1 de 198
Descargar para leer sin conexión
RxSwift
(github.com/devxoul)
• StyleShare Inc.
• SW Maestro 2
• RxSwift
RxSwift?
RxSwift = ReactiveX + Swift
RxSwift = ReactiveX + Swift
RxSwift = ReactiveX + Swift
?
RxSwift = ReactiveX + Swift
Re + ActiveX
RxSwift = ReactiveX + Swift
Reactive + Extension
RxSwift = ReactiveX + Swift
RxSwift = ReactiveX + Swift
?
a = 10
b = a * 2
a = 10
b = a * 2
print(b)
a = 10
b = a * 2
print(b) // 20
a = 10
b = a * 2
print(b) // 20
a = 30
a = 10
b = a * 2
print(b) // 20
a = 30
print(b)
a = 10
b = a * 2
print(b) // 20
a = 30
print(b) // 20
a = 10
b = a * 2
print(b) // 20
a = 30
print(b) // 20 60
ReactiveX
Observer
Pattern
Iterator
Pattern
Functional
Programming
ReactiveX
Observer
Pattern
Iterator
Pattern
Functional
Programming
Observable
Observer
Observable
Observer
observe
Observable
Observer
observe notify
Observable
ObserverObserver Observer
ReactiveX
Observer
Pattern
Iterator
Pattern
Functional
Programming
Iterator next()
hasNext()
Iterator next()
hasNext()
10 20 30 40
Iterator next()
hasNext()
10 20 30 40
Iterator next()
hasNext()
10 20 30 40
iterator.next()
Iterator next()
hasNext()
10 20 30 40
iterator.next() // 10
Iterator next()
hasNext()
10 20 30 40
Iterator next()
hasNext()
10 20 30 40
iterator.next()
Iterator next()
hasNext()
10 20 30 40
iterator.next() // 20
Iterator next()
hasNext()
10 20 30 40
Iterator next()
hasNext()
10 20 30 40
iterator.next()
Iterator next()
hasNext()
10 20 30 40
iterator.next() // 30
Iterator next()
hasNext()
10 20 30 40
Iterator next()
hasNext()
10 20 30 40
iterator.next()
Iterator next()
hasNext()
10 20 30 40
iterator.next() // 40
Iterator next()
hasNext()
10 20 30 40
Iterator next()
hasNext()
10 20 30 40
iterator.hasNext() // false
ReactiveX
Observer
Pattern
Iterator
Pattern
Functional
Programming
•
• ,
•
•
• ...
higher-order fuction
pure fuction
•
•
• ...
higher-order fuction
pure fuction
1.
2.
var array = [2, 6, 3, 1, 7]
array.sort(by: { a, b in
return a < b
})
var array = [2, 6, 3, 1, 7]
array.sort(by: { a, b in
return a < b
})
var array = [2, 6, 3, 1, 7]
array.sort(by: { a, b in
return a < b
})
•
•
• ...
higher-order fuction
pure fuction
•
•
•
•
( , , I/O )
•
•
var rate = 1130
func krw(usd: Int) -> Int {
return usd * rate
}
var rate = 1130
func krw(usd: Int) -> Int {
return usd * rate
}
krw(usd: 2) // 2260
krw(usd: 3) // 3390
var rate = 1130
func krw(usd: Int) -> Int {
return usd * rate
}
rate = 1140
krw(usd: 2) // 2260
krw(usd: 3) // 3390
var rate = 1130
func krw(usd: Int) -> Int {
return usd * rate
}
rate = 1140
krw(usd: 2) // 2260 2280
krw(usd: 3) // 3390 3420
var rate = 1130
func krw(usd: Int) -> Int {
return usd * rate
}
rate = 1140
krw(usd: 2) // 2260 2280
krw(usd: 3) // 3390 3420
var rate = 1130
func krw(usd: Int) -> Int {
return usd * rate
}
rate = 1140
krw(usd: 2) // 2260 2280
krw(usd: 3) // 3390 3420
func krw(usd: Int) -> Int {
return usd * rate
}
func krw(usd: Int ) -> Int {
return usd * rate
}
func krw(usd: Int, rate: Int) -> Int {
return usd * rate
}
func krw(usd: Int, rate: Int) -> Int {
return usd * rate
}
ReactiveX
Observable
Pattern
Iterator
Pattern
Functional
Programming
a 10
b a * 2
a 10
b 20
a
b
10 20 30 40a
20 40 60 80b
10 20 30 40a
20 40 60 80b
10 20 30 40a
20 40 60 80b
map(x => x * 2)
10 20 30 40a
20 40 60 80b
map(x => x * 2)
Marble Diagrams
20 40 60 80b
map(x => x * 2)
Observable.from([10, 20, 30, 40])
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value)
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value)
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value)
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value) // 20
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value)
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value)
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value) // 40
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value)
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value)
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value) // 60
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value)
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value)
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value) // 80
})
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value) // 80
})
Observable
Observable.from([10, 20, 30, 40])
.map { $0 * 2 }
.subscribe(onNext: { value in
print(value) // 80
})
Observer
Password
(4 )
1
(4 )
. ❌
12
(4 )
. ❌
123
(4 )
. ❌
1234
(4 )
. 👍
"1"
"1"
map(str => str.length >= 4)
"1"
map(str => str.length >= 4)
false
"1"
false
map(str => str.length >= 4)
map(valid => getMessage(valid))
"1"
false
map(str => str.length >= 4)
"❌ "
map(valid => getMessage(valid))
"1" "12"
false
map(str => str.length >= 4)
"❌ "
map(valid => getMessage(valid))
"1" "12"
false false
map(str => str.length >= 4)
"❌ "
map(valid => getMessage(valid))
"1" "12"
false false
map(str => str.length >= 4)
"❌ " "❌ "
map(valid => getMessage(valid))
"1" "12" "123"
false false
map(str => str.length >= 4)
"❌ " "❌ "
map(valid => getMessage(valid))
"1" "12" "123"
false false false
map(str => str.length >= 4)
"❌ " "❌ "
map(valid => getMessage(valid))
"1" "12" "123"
false false false
map(str => str.length >= 4)
"❌ " "❌ " "❌ "
map(valid => getMessage(valid))
"1" "12" "123" "1234"
false false false
map(str => str.length >= 4)
"❌ " "❌ " "❌ "
map(valid => getMessage(valid))
"1" "12" "123" "1234"
false false false true
map(str => str.length >= 4)
"❌ " "❌ " "❌ "
map(valid => getMessage(valid))
false false false true
map(str => str.length >= 4)
map(valid => getMessage(valid))
"1" "12" "123" "1234"
"❌ " "❌ " "❌ " "👍"
passwordField.rx.text.orEmpty
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
}
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
"1"
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
false
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
"12"
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
false
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
"123"
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
false
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
"1234"
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
true
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
passwordField.rx.text.orEmpty
.map { $0.characters.count >= 4 }
.map { isValid in
if isValid {
return " . 👍"
} else {
return " . ❌"
}
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.rx.text = message
})
: Observable<String>
: Observable<Int>
: Observable<Void>
: Observable<CGPoint>
...
Observable
"1" "12" "123" "1234"
"1"
"1"
"1" "12"
"1" "12"
"1" "12" "123"
"1" "12" "123"
"1" "12" "123" "1234"
Nickname
. ❌
. ❌
. 👍
API
API
=
nicknameField.rx.text.orEmpty
nicknameField.rx.text.orEmpty
.map { nickname -> Bool in
// return true of false
}
🤔 ?
nicknameField.rx.text.orEmpty
.map { nickname -> Bool in
// return true of false
}
nicknameField.rx.text.orEmpty
. map { nickname -> Bool in
}
nicknameField.rx.text.orEmpty
.flatMap { nickname -> Observable<Bool> in
}
nicknameField.rx.text.orEmpty
.flatMap { nickname -> Observable<Bool> in
return API.checkNickname(nickname)
}
nicknameField.rx.text.orEmpty
.flatMap { nickname -> Observable<Bool> in
return API.checkNickname(nickname)
}
.map { isAvailable in
return getMessage(isAvailable)
}
nicknameField.rx.text.orEmpty
.flatMap { nickname -> Observable<Bool> in
return API.checkNickname(nickname)
}
.map { isAvailable in
return getMessage(isAvailable)
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.text = message
})
map() vs flatMap()
20 40 60 80
map(x => x * 2)
10 20 30 40
map() vs flatMap()
flatMap( => )
map() vs flatMap()
flatMap( => )
map() vs flatMap()
flatMap( => )
map() vs flatMap()
flatMap( => )
map() vs flatMap()
flatMap( => )
map() vs flatMap()
flatMap( => )
map() vs flatMap()
flatMap( => )
map() vs flatMap()
flatMap( => )
map() vs flatMap()
flatMap( => )
map() vs flatMap()
flatMap( => )
map() vs flatMap()
flatMap( => )
Nickname
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
nicknameField.rx.text.orEmpty
.flatMap { nickname -> Observable<Bool> in
return API.checkNickname(nickname)
}
.map { isAvailable in
return getMessage(isAvailable)
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.text = message
})
nicknameField.rx.text.orEmpty
.debounce(0.3, scheduler: MainScheduler.instance)
.flatMap { nickname -> Observable<Bool> in
return API.checkNickname(nickname)
}
.map { isAvailable in
return getMessage(isAvailable)
}
.subscribe(onNext: { [weak self] message in
self?.messageLabel.text = message
})
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
0.3s
0.3s
0.3s
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
checkNickname(" ")
0.3s
0.3s
0.3s
1 4
debounce
1 2 3 4
, Observable
Timer
00:17
Timer
00:17
Observable<Int>
.interval(1, scheduler: ...)
.subscribe(onNext: { tick in
print(tick)
})
Timer
00:17
Start
17
18
19
20
21
...
Start
Start
Observable
Timer
00:17
Observable<Int>
.interval(1, scheduler: ...)
.subscribe(onNext: { tick in
print(tick)
})
Timer
00:17
var disposeBag = DisposeBag()
Observable<Int>
.interval(1, scheduler: ...)
.subscribe(onNext: { tick in
print(tick)
})
.disposed(by: disposeBag)
Timer
00:17
var disposeBag = DisposeBag()
Observable<Int>
.interval(1, scheduler: ...)
.subscribe(onNext: { tick in
print(tick)
})
.disposed(by: disposeBag)
var disposeBag = DisposeBag()
Observable<Int>
.interval(1, scheduler: ...)
.subscribe(onNext: { tick in
print(tick)
})
.disposed(by: disposeBag)
Start
var disposeBag = DisposeBag()
Observable<Int>
.interval(1, scheduler: ...)
.subscribe(onNext: { tick in
print(tick)
})
.disposed(by: disposeBag)
Start
var disposeBag = DisposeBag()
Observable<Int>
.interval(1, scheduler: ...)
.subscribe(onNext: { tick in
print(tick)
})
.disposed(by: disposeBag)
Start
var disposeBag = DisposeBag()
Observable<Int>
.interval(1, scheduler: ...)
.subscribe(onNext: { tick in
print(tick)
})
.disposed(by: disposeBag)
Start
Dispose
•
•
•
RxSwift
http://reactivex.io
http://rxswift.org
http://community.rxswift.org
https://rxswift-slack.herokuapp.com
.
(github.com/devxoul)

Más contenido relacionado

La actualidad más candente

Modern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapModern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapHoward Lewis Ship
 
Programming Lisp Clojure - 2장 : 클로저 둘러보기
Programming Lisp Clojure - 2장 : 클로저 둘러보기Programming Lisp Clojure - 2장 : 클로저 둘러보기
Programming Lisp Clojure - 2장 : 클로저 둘러보기JangHyuk You
 
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFabio Collini
 
An Elephant of a Different Colour: Hack
An Elephant of a Different Colour: HackAn Elephant of a Different Colour: Hack
An Elephant of a Different Colour: HackVic Metcalfe
 
Building fast interpreters in Rust
Building fast interpreters in RustBuilding fast interpreters in Rust
Building fast interpreters in RustIngvar Stepanyan
 
Functional pe(a)rls: Huey's zipper
Functional pe(a)rls: Huey's zipperFunctional pe(a)rls: Huey's zipper
Functional pe(a)rls: Huey's zipperosfameron
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinFabio Collini
 
여자개발자모임터 6주년 개발 세미나 - Scala Language
여자개발자모임터 6주년 개발 세미나 - Scala Language여자개발자모임터 6주년 개발 세미나 - Scala Language
여자개발자모임터 6주년 개발 세미나 - Scala LanguageAshal aka JOKER
 
Indexing thousands of writes per second with redis
Indexing thousands of writes per second with redisIndexing thousands of writes per second with redis
Indexing thousands of writes per second with redispauldix
 
Cycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveCycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveEugene Zharkov
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applicationsSkills Matter
 
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...takeoutweight
 

La actualidad más candente (20)

Modern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapModern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter Bootstrap
 
Programming Lisp Clojure - 2장 : 클로저 둘러보기
Programming Lisp Clojure - 2장 : 클로저 둘러보기Programming Lisp Clojure - 2장 : 클로저 둘러보기
Programming Lisp Clojure - 2장 : 클로저 둘러보기
 
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
 
Benefits of Kotlin
Benefits of KotlinBenefits of Kotlin
Benefits of Kotlin
 
An Elephant of a Different Colour: Hack
An Elephant of a Different Colour: HackAn Elephant of a Different Colour: Hack
An Elephant of a Different Colour: Hack
 
Building fast interpreters in Rust
Building fast interpreters in RustBuilding fast interpreters in Rust
Building fast interpreters in Rust
 
Introduction to Groovy
Introduction to GroovyIntroduction to Groovy
Introduction to Groovy
 
Functional pe(a)rls: Huey's zipper
Functional pe(a)rls: Huey's zipperFunctional pe(a)rls: Huey's zipper
Functional pe(a)rls: Huey's zipper
 
Rust ⇋ JavaScript
Rust ⇋ JavaScriptRust ⇋ JavaScript
Rust ⇋ JavaScript
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
 
ddd+scala
ddd+scaladdd+scala
ddd+scala
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
 
여자개발자모임터 6주년 개발 세미나 - Scala Language
여자개발자모임터 6주년 개발 세미나 - Scala Language여자개발자모임터 6주년 개발 세미나 - Scala Language
여자개발자모임터 6주년 개발 세미나 - Scala Language
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
Lập trình Python cơ bản
Lập trình Python cơ bảnLập trình Python cơ bản
Lập trình Python cơ bản
 
Indexing thousands of writes per second with redis
Indexing thousands of writes per second with redisIndexing thousands of writes per second with redis
Indexing thousands of writes per second with redis
 
Cycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveCycle.js: Functional and Reactive
Cycle.js: Functional and Reactive
 
ES6, WTF?
ES6, WTF?ES6, WTF?
ES6, WTF?
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
 
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...
 

Similar a RxSwift 시작하기

Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)MongoSF
 
Exploring fractals in CSS, @fronttrends, Warsaw, 2015
Exploring fractals in CSS, @fronttrends, Warsaw, 2015Exploring fractals in CSS, @fronttrends, Warsaw, 2015
Exploring fractals in CSS, @fronttrends, Warsaw, 2015pixelass
 
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6Workhorse Computing
 
Laziness in Swift
Laziness in Swift Laziness in Swift
Laziness in Swift SwiftWro
 
循環参照のはなし
循環参照のはなし循環参照のはなし
循環参照のはなしMasahiro Honma
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Jonas Bonér
 
Pragmatic Real-World Scala
Pragmatic Real-World ScalaPragmatic Real-World Scala
Pragmatic Real-World Scalaparag978978
 
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Masahiro Nagano
 
20 modules i haven't yet talked about
20 modules i haven't yet talked about20 modules i haven't yet talked about
20 modules i haven't yet talked aboutTatsuhiko Miyagawa
 
Apache Spark for Library Developers with William Benton and Erik Erlandson
 Apache Spark for Library Developers with William Benton and Erik Erlandson Apache Spark for Library Developers with William Benton and Erik Erlandson
Apache Spark for Library Developers with William Benton and Erik ErlandsonDatabricks
 
Crazy things done on PHP
Crazy things done on PHPCrazy things done on PHP
Crazy things done on PHPTaras Kalapun
 
Taking Perl to Eleven with Higher-Order Functions
Taking Perl to Eleven with Higher-Order FunctionsTaking Perl to Eleven with Higher-Order Functions
Taking Perl to Eleven with Higher-Order FunctionsDavid Golden
 
Funcitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional WayFuncitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional WayNatasha Murashev
 
Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB jhchabran
 
"Coffee Script" in Brief
"Coffee Script" in Brief"Coffee Script" in Brief
"Coffee Script" in BriefNat Weerawan
 
Wx::Perl::Smart
Wx::Perl::SmartWx::Perl::Smart
Wx::Perl::Smartlichtkind
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryDatabricks
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryDatabricks
 
Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6garux
 
JSDC 2014 - functional java script, why or why not
JSDC 2014 - functional java script, why or why notJSDC 2014 - functional java script, why or why not
JSDC 2014 - functional java script, why or why notChengHui Weng
 

Similar a RxSwift 시작하기 (20)

Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
 
Exploring fractals in CSS, @fronttrends, Warsaw, 2015
Exploring fractals in CSS, @fronttrends, Warsaw, 2015Exploring fractals in CSS, @fronttrends, Warsaw, 2015
Exploring fractals in CSS, @fronttrends, Warsaw, 2015
 
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
 
Laziness in Swift
Laziness in Swift Laziness in Swift
Laziness in Swift
 
循環参照のはなし
循環参照のはなし循環参照のはなし
循環参照のはなし
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
 
Pragmatic Real-World Scala
Pragmatic Real-World ScalaPragmatic Real-World Scala
Pragmatic Real-World Scala
 
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
 
20 modules i haven't yet talked about
20 modules i haven't yet talked about20 modules i haven't yet talked about
20 modules i haven't yet talked about
 
Apache Spark for Library Developers with William Benton and Erik Erlandson
 Apache Spark for Library Developers with William Benton and Erik Erlandson Apache Spark for Library Developers with William Benton and Erik Erlandson
Apache Spark for Library Developers with William Benton and Erik Erlandson
 
Crazy things done on PHP
Crazy things done on PHPCrazy things done on PHP
Crazy things done on PHP
 
Taking Perl to Eleven with Higher-Order Functions
Taking Perl to Eleven with Higher-Order FunctionsTaking Perl to Eleven with Higher-Order Functions
Taking Perl to Eleven with Higher-Order Functions
 
Funcitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional WayFuncitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional Way
 
Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB
 
"Coffee Script" in Brief
"Coffee Script" in Brief"Coffee Script" in Brief
"Coffee Script" in Brief
 
Wx::Perl::Smart
Wx::Perl::SmartWx::Perl::Smart
Wx::Perl::Smart
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love Story
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love Story
 
Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6
 
JSDC 2014 - functional java script, why or why not
JSDC 2014 - functional java script, why or why notJSDC 2014 - functional java script, why or why not
JSDC 2014 - functional java script, why or why not
 

Más de Suyeol Jeon

Hello, ReactorKit 
Hello, ReactorKit Hello, ReactorKit 
Hello, ReactorKit Suyeol Jeon
 
Building Funnels with Google BigQuery
Building Funnels with Google BigQueryBuilding Funnels with Google BigQuery
Building Funnels with Google BigQuerySuyeol Jeon
 
ReactorKit으로 단방향 반응형 앱 만들기
ReactorKit으로 단방향 반응형 앱 만들기ReactorKit으로 단방향 반응형 앱 만들기
ReactorKit으로 단방향 반응형 앱 만들기Suyeol Jeon
 
StyleShare 2014년 8월 관점공유 - 전수열
StyleShare 2014년 8월 관점공유 - 전수열StyleShare 2014년 8월 관점공유 - 전수열
StyleShare 2014년 8월 관점공유 - 전수열Suyeol Jeon
 
Present your presentation
Present your presentationPresent your presentation
Present your presentationSuyeol Jeon
 
Joyfl 창업이야기.ssul
Joyfl 창업이야기.ssulJoyfl 창업이야기.ssul
Joyfl 창업이야기.ssulSuyeol Jeon
 
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자Suyeol Jeon
 
Evermind (2차 평가)
Evermind (2차 평가)Evermind (2차 평가)
Evermind (2차 평가)Suyeol Jeon
 

Más de Suyeol Jeon (11)

Let's TDD
Let's TDDLet's TDD
Let's TDD
 
Hello, ReactorKit 
Hello, ReactorKit Hello, ReactorKit 
Hello, ReactorKit 
 
Building Funnels with Google BigQuery
Building Funnels with Google BigQueryBuilding Funnels with Google BigQuery
Building Funnels with Google BigQuery
 
ReactorKit으로 단방향 반응형 앱 만들기
ReactorKit으로 단방향 반응형 앱 만들기ReactorKit으로 단방향 반응형 앱 만들기
ReactorKit으로 단방향 반응형 앱 만들기
 
Evermind
EvermindEvermind
Evermind
 
StyleShare 2014년 8월 관점공유 - 전수열
StyleShare 2014년 8월 관점공유 - 전수열StyleShare 2014년 8월 관점공유 - 전수열
StyleShare 2014년 8월 관점공유 - 전수열
 
Present your presentation
Present your presentationPresent your presentation
Present your presentation
 
Joyfl 창업이야기.ssul
Joyfl 창업이야기.ssulJoyfl 창업이야기.ssul
Joyfl 창업이야기.ssul
 
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
 
Evermind (2차 평가)
Evermind (2차 평가)Evermind (2차 평가)
Evermind (2차 평가)
 
I'm Traveling
I'm TravelingI'm Traveling
I'm Traveling
 

Último

Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastPapp Krisztián
 
tonesoftg
tonesoftgtonesoftg
tonesoftglanshi9
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxalwaysnagaraju26
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...masabamasaba
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Bert Jan Schrijver
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationJuha-Pekka Tolvanen
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...masabamasaba
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benonimasabamasaba
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park masabamasaba
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2
 

Último (20)

Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - Kanchana
 
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 

RxSwift 시작하기