Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Comparative Asynchronous Programming
Search
Ash Furrow
February 24, 2017
Programming
2
9.1k
Comparative Asynchronous Programming
Presented at Playgrounds Conf:
http://www.playgroundscon.com/
Ash Furrow
February 24, 2017
Tweet
Share
More Decks by Ash Furrow
See All by Ash Furrow
Migrating to React Native: A Long-Term Retrospective
ashfurrow
0
170
How Artsy Automates Team Culture
ashfurrow
0
2.8k
Building Custom TSLint Rules
ashfurrow
0
340
Circumventing Fear of the Unknown
ashfurrow
1
440
Building Better Software by Building Better Teams
ashfurrow
1
480
Building Open Source Communities
ashfurrow
0
730
Building Compassionate Software
ashfurrow
0
330
Swift, Briskly
ashfurrow
0
110
iOS Checkup
ashfurrow
1
770
Other Decks in Programming
See All in Programming
What you can do with Ruby on WebAssembly
kateinoigakukun
0
170
Hono・Prisma・AWSでGeoなAPI開発
nokonoko1203
5
680
いつか使える ObjectSpace / Maybe useful ObjectSpace
euglena1215
2
140
Lessons by WebAssembly app in production on CDN Edge Computing Service
tetsuharuohzeki
0
210
Perl 5 OOP機構30年史 - Perl 5's OOP Mechanism over the past 30 years
moznion
0
370
Scala アプリケーションのビルドを改善してデプロイ時間を 1/4 にした話 | How I improved the build of my Scala application and reduced deployment time by 4x
nomadblacky
1
180
事業フェーズの変化に対応する 開発生産性向上のゼロイチ
masaygggg
0
200
Patched fetch did not work
quramy
4
400
Prolog入門
qnighy
4
1k
Kotlin 2.0が与えるAndroid開発の進化
masayukisuda
1
420
Debugging: All you need to know (for simultaneous interpreting)
jmatsu
2
890
GoのIteratorに詳しくなってしまう
inatonix
1
200
Featured
See All Featured
The Mythical Team-Month
searls
218
43k
Imperfection Machines: The Place of Print at Facebook
scottboms
263
13k
Fashionably flexible responsive web design (full day workshop)
malarkey
401
65k
Practical Orchestrator
shlominoach
185
10k
A Philosophy of Restraint
colly
202
16k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
109
6.9k
Happy Clients
brianwarren
96
6.6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
24
610
Intergalactic Javascript Robots from Outer Space
tanoku
268
26k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
41
6.5k
A Tale of Four Properties
chriscoyier
155
22k
Building a Scalable Design System with Sketch
lauravandoore
459
32k
Transcript
Comparative Asynchronous Programming
None
Agenda 1. Asynchronous programming is hard. 2. Swift already supports
a few async methodologies. 3. Swift supports some other paradigms. 4. But lacks support for others.
Asynchronous Programming: Difficult and Subjective
“Normal” programming
let returnValue = someFunctionCall()
Asynchronous programming
Development is all about tradeoffs
let file = readFile() ... readFile() { file in ...
}
Embrace Tradeoffs
Swift Has Async Built-in. Sorta.
Built-in Async Approaches
Grand Central Dispatch
NSOperationQueue / DRBOperationTree
POSIX Threads
Target / Action
Callbacks / Completion Handlers
logIn(with: credentials) { result in // Handle login success or
failure }
Callback Hell
getCredentialsFromUser() { credentials in logIn(with: credentials) { result in //
Handle login success or failure } }
getCredentialsFromUser() { credentials, error in if credentials { logIn(with: credentials)
{ login, error in if login { // Handle login success } else { // Handle error } } } else { // Handle error } }
(credentials: Credentials?) -> Void (credentials: Credentials?, error: Error?) -> Void
(result: Result<Credentials>) -> Void
enum Result<T> { case success(T) case error(Error) }
Callback Heaven
Some Async Abstractions are Supported in Swift
Promises & Futures
getCredentialsFromUser() .flatMap { credentials in return login(with: credentials) } .onSuccess
{ login in // Handle login success } .onFailure { error in // Handle login error }
Functional Reactive Programming
getCredentialsFromUser() .flatMap { credentials in return login(with: credentials) } .on(next:
{ login in // Handle login success }, error: { error in // Handle login error })
None
gerstureRecognizer.rx .event .map { recognizer in return recognizer.location(in: recognizer.view) }
.bind(to: circle.rx.center)
Actor Model
None
Actor Model
Some Async Abstractions are Impossible in Swift
Async / Await
async func logIn() -> Login { let credentials = await
getCredentialsFromUser() return await logIn(with: credentials) }
Coroutines and Generator Functions
func fibGenerator*() -> Int { var i = 0, j
= 1 repeat { let next = i + j yield next (i, j) = (j, next) } while true } fibGenerator() // returns 1 fibGenerator() // returns 2 fibGenerator() // returns 3 fibGenerator() // returns 5
Wrap Up 1. There’s no “right way” to do async
programming. 2. Asynchronous abstractions built into Swift aren’t great. 3. There are some cool things you can do in Swift. 4. There are other cool things that you can’t do in Swift.
None