SlideShare ist ein Scribd-Unternehmen logo
1 von 198
Downloaden Sie, um offline zu lesen
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)

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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...
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Mehr von 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
 

Mehr von 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
 

Kürzlich hochgeladen

Understanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM ArchitectureUnderstanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM Architecturerahul_net
 
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxRTS corp
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingShane Coughlan
 
What’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesWhat’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesVictoriaMetrics
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shardsChristopher Curtin
 
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdfAndrey Devyatkin
 
Osi security architecture in network.pptx
Osi security architecture in network.pptxOsi security architecture in network.pptx
Osi security architecture in network.pptxVinzoCenzo
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITmanoharjgpsolutions
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...OnePlan Solutions
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalLionel Briand
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slidesvaideheekore1
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Rob Geurden
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonApplitools
 
eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolsosttopstonverter
 
Ronisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited CatalogueRonisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited Catalogueitservices996
 
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4jGraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4jNeo4j
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfEnhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfRTS corp
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZABSYZ Inc
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?Alexandre Beguel
 

Kürzlich hochgeladen (20)

Understanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM ArchitectureUnderstanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM Architecture
 
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
 
What’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesWhat’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 Updates
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards
 
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
 
Osi security architecture in network.pptx
Osi security architecture in network.pptxOsi security architecture in network.pptx
Osi security architecture in network.pptx
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh IT
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive Goal
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slides
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
 
eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration tools
 
Ronisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited CatalogueRonisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited Catalogue
 
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4jGraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfEnhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZ
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?
 

RxSwift 시작하기