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

The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfryanfarris8
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...kalichargn70th171
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfproinshot.com
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech studentsHimanshiGarg82
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplatePresentation.STUDIO
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
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
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 

Último (20)

The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
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
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 

RxSwift 시작하기