Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Comparative Asynchronous Programming
Ash Furrow
February 24, 2017
Programming
2
8.4k
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
93
How Artsy Automates Team Culture
ashfurrow
0
2k
Building Custom TSLint Rules
ashfurrow
0
180
Circumventing Fear of the Unknown
ashfurrow
1
240
Building Better Software by Building Better Teams
ashfurrow
1
310
Building Open Source Communities
ashfurrow
0
390
Building Compassionate Software
ashfurrow
0
200
Swift, Briskly
ashfurrow
0
83
iOS Checkup
ashfurrow
1
650
Other Decks in Programming
See All in Programming
Lookerとdbtの共存
ttccddtoki
0
640
atama plusの開発チームはどのように「不確実性」に向き合ってきたか〜2022夏版〜
atamaplus
3
620
Now in Android Overview
aosa4054
1
400
SGGとは
inoue2002
0
440
読みやすいコード クラスメソッド 2022 年度新卒研修
januswel
0
2.9k
企業内スモールデータでのデータ解析
hamage9
0
890
Rust on Lambda 大きめCSV生成
atsuyokota
1
400
Getting Started With Data Structures
adoranwodo
1
260
Dagger, la CI, autrement
guikingone
1
110
回帰分析ではlm()ではなくestimatr::lm_robust()を使おう / TokyoR100
dropout009
0
4.5k
VIMRC 2022
achimnol
0
140
閱讀原始碼 - 再戰十年的 jQuery
eddie
1
300
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
239
11k
Fantastic passwords and where to find them - at NoRuKo
philnash
27
1.6k
Reflections from 52 weeks, 52 projects
jeffersonlam
337
17k
Building a Scalable Design System with Sketch
lauravandoore
448
30k
VelocityConf: Rendering Performance Case Studies
addyosmani
316
22k
Visualization
eitanlees
125
12k
5 minutes of I Can Smell Your CMS
philhawksworth
196
18k
Fireside Chat
paigeccino
13
1.4k
The Art of Programming - Codeland 2020
erikaheidi
32
11k
Designing with Data
zakiwarfel
91
4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
655
120k
WebSockets: Embracing the real-time Web
robhawkes
57
5.6k
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