Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Concurrency in JavaScriptCore.framework
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yuichi Kobayashi
July 24, 2023
Technology
2.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Concurrency in JavaScriptCore.framework
Yuichi Kobayashi
July 24, 2023
More Decks by Yuichi Kobayashi
See All by Yuichi Kobayashi
RxSwiftからCombineへの移行準備とSwiftUIへの道標
imk2o
0
550
UICollectionViewCompositionalLayoutできれいなGrid Layoutをつくる
imk2o
1
1k
Other Decks in Technology
See All in Technology
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.9k
.NET WebAssemblyで実現するクライアントサイドAI推論:NuGetからViteまで、2つのエコシステムを繋ぐビルド戦略
yamachu
1
950
高負荷プロダクション環境におけるAWS Lambdaのリアル 〜スケールとコストを左右する実行ライフサイクルの技術仕様〜
maimyyym
2
690
Datadog で始める トークンセーフティなAI 導⼊と定着
vkbaba
1
110
「大丈夫そう?」をObservabilityで確かめる
mrmtsu
0
190
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
310
Antigravity SDK for the Java Developer
glaforge
0
210
Making AI Agents Safe and Fast- Jev, Obsidian, and the Meta-Harness
x5gtrn
PRO
0
140
LT:「このままでいいのかな?」から一歩踏み出した私のデータキャリア選択〜社会人3年目に上京を決意したリアル〜Snowflake女子会 vol.8
snowwmn0824
0
100
AWS DevOps Agent スキルをつかいこなそう / Master AWS DevOps Agent Skills
kinunori
2
550
セルフサービスのオブザーバビリティ基盤をOpenTelemetryで作る / Building a Self-Service Observability Platform with OpenTelemetry
ymotongpoo
3
380
【技術的負債conf】事業成長に伴う技術的負債の説明責任とAIによるモニタリング、認知的負債について
i35_267
4
2.2k
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
920
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
690
A better future with KSS
kneath
240
18k
Embracing the Ebb and Flow
colly
88
5.2k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
510
Writing Fast Ruby
sferik
630
63k
Paper Plane
katiecoart
PRO
4
53k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
510
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Transcript
@imk 2 o Concurrency in JavaScriptCore.framework potatotips # 8 3
2 ⾃⼰紹介 ίόϠγ ϢΠν iOS Engineer@MedPeer Copyright(C) 2 0 2
3 ALL RIGHTS RESERVED, MedPeer, Inc. @imk 2 o
3 JavaScriptCore.framework使ったことあります?🙋 Copyright(C) 2 0 2 3 ALL RIGHTS RESERVED,
MedPeer, Inc.
基本のおさらい JavaScriptCore.frameworkͱʁ
5 JavaScriptCore.frameworkの今北産業 ΞϓϦʹJavaScriptίʔυͷ࣮ߦڥΛΈࠐΊΔϑϨʔϜϫʔΫ Swift/Objective-CͷܕؔΛΤΫεϙʔτͯ͠ར༻Մೳ ΞϓϦͷػೳΛJSͰ੍ޚͨ͠ΓɺৼΔ͍ΛΧελϚΠζͰ͖Δ Copyright(C) 2 0 2 3
ALL RIGHTS RESERVED, MedPeer, Inc.
6 JavaScriptコードの実⾏⽅法 1. JavaScriptCore.frameworkΛΠϯϙʔτ 2. JSContextΛ༻ҙ 3. evaluateScript()Λίʔϧ Copyright(C) 2
0 2 3 ALL RIGHTS RESERVED, MedPeer, Inc. import JavaScriptCore let jsContext = JSContext() jsContext.evaluateScript("JavaScript code here...")
7 JSValueについて JSڥ্ͷΛද͢ΦϒδΣΫτ Swiftͱ૬ޓʹσʔλΛΓͱΓ͢Δཁ Copyright(C) 2 0 2 3 ALL
RIGHTS RESERVED, MedPeer, Inc.
8 Swiftオブジェクトのエクスポート 1. JSExportʹ४ڌͨ͠@objc protocolͰΤΫεϙʔτϝιουΛఆٛ 2. ্هͷϓϩτίϧΛΫϥεͰ࣮ 3. JSContext#setObject()ͰΤΫεϙʔτ Copyright(C)
2 0 2 3 ALL RIGHTS RESERVED, MedPeer, Inc. @objc protocol ModuleJS: NSObjectProtocol, JSExport { static func foo(_ value: Double) -> JSValue } final class Module: NSObject, ModuleJS { static func foo(_ value: Double) -> JSValue { ... } } jsContext.setObject(Module.self, forKeyedSubscript: "module" as NSString) const result = module.foo(9.41); .swift .js
9 Tips: Swiftクラスのエクスポート 1. ΤΫεϙʔτ͍ͨ͠ΫϥεΛJSExportʹ४ڌ 2. ϑΝΫτϦؔΛ༻ҙ Copyright(C) 2 0
2 3 ALL RIGHTS RESERVED, MedPeer, Inc. @objc protocol ColorJS: NSObjectProtocol, JSExport { var r: CGFloat { get } var g: CGFloat { get } var b: CGFloat { get } var a: CGFloat { get } } final class ColorImp: NSObject, ColorJS { ... } @objc protocol ModuleJS: NSObjectProtocol, JSExport { static func Color(_ r: CGFloat, _ g: CGFloat, _ b: CGFloat, _ a: CGFloat) -> ColorJS } const color = module.Color(0.5, 0.6, 0.7); const red = color.r; .swift .js
だいたいわかったところで ຊʹೖΓ·͢ʂ
11 JavaScriptCore.frameworkでもConcurrencyやれんのか? Ͱ͖·͢ʂ ͨͩͪ͠ΐͬͱ͕ཁΓ·͢ Copyright(C) 2 0 2 3 ALL
RIGHTS RESERVED, MedPeer, Inc.
12 Promise, async/await@JS JavaScript(~ECMAScript 2015)ʹ͓͚ΔඇಉظॲཧͷΈ async/awaitPromise/thenͷγϯλοΫεγϡΨʔ Copyright(C) 2 0 2
3 ALL RIGHTS RESERVED, MedPeer, Inc. const process = new Promise((resolve, reject) => { ... resolve(result); }); process.then((result) => { ... }); .js async function process() { ... return result; } const result = await process();
13
[email protected]
JSValue(newPromiseIn:fromExecutor:)Λ͏ Copyright(C) 2 0 2 3 ALL RIGHTS
RESERVED, MedPeer, Inc. iOS 1 3 でしれっと追加されていた... final class Module: NSObject, JSModule { static func bar() -> JSValue { return .init(newPromiseIn: .current()) { resolve, reject in ... } } } const result = await module.bar(); .swift .js
14 できたッ! Copyright(C) 2 0 2 3 ALL RIGHTS RESERVED,
MedPeer, Inc.
15 ...と思ったらRuntime Error!! Copyright(C) 2 0 2 3 ALL RIGHTS
RESERVED, MedPeer, Inc.
16 なんでよ? Copyright(C) 2 0 2 3 ALL RIGHTS RESERVED,
MedPeer, Inc.
17 Top-level await ECMAScript 2022͔ΒରԠ JavaScriptCore.frameworkͰ·ͩରԠ͍ͯ͠ͳ͍ iOS17 SDKͰରԠͯ͠ͳͦ͞͏😢 Copyright(C) 2
0 2 3 ALL RIGHTS RESERVED, MedPeer, Inc. async関数の外、つまりメインコード中でもawaitできる仕組み evaluateScript() asyncが出るまでConcurrencyできないのか😇
18 じゃあ、Swiftでやればいい。 Copyright(C) 2 0 2 3 ALL RIGHTS RESERVED,
MedPeer, Inc.
SwiftͰTop-level awaitʹରԠ͢Δʹ
20 Top-level awaitの⽣存戦略 Copyright(C) 2 0 2 3 ALL RIGHTS
RESERVED, MedPeer, Inc. 1. JSͷϝΠϯίʔυͰͷawaitఘΊΔ 2. ೖΓޱͱͳΔJSඇಉظؔΛSwiftଆ͔Βݺͼग़͠ɺͦͷྃΛػ 3. ྃػʹSemaphoreΛ͏ // Swift͔Β͜ͷඇಉظؔΛݺͼग़͠ɺػͯ͠Β͏ async main() { const result = await module.bar(); } // Top-level awaitͰ͖ͳͷͰɺϝΠϯίʔυ͔Βͷݺͼग़͖͋͠ΒΊΔ // await main(); .js
21 SwiftからJS上の⾮同期関数を呼ぶ JSඇಉظؔΛPromiseͱͯ͠ࢀর͠ɺthen()ΛݺͿ Copyright(C) 2 0 2 3 ALL RIGHTS
RESERVED, MedPeer, Inc. // main()ϩʔυ͞ΕΔ͕ɺಈ࡞͠ͳ͍ jsContext.evaluateScript(code) let semaphore = DispatchSemaphore(value: 0) // JavaScript͔Βݺͼग़͠ՄೳͳClosureΛ༻ҙ // (@convention(block)ʹ͍ͭͯJSValueͷυΩϡϝϯτࢀর) let onFulfilled: @convention(block) (JSValue) -> Void = { _ in semaphore.signal() } let onRejected: @convention(block) (JSValue) -> Void = { _ in // TODO: Handle error semaphore.signal() } // main()͔ΒPromiseΦϒδΣΫτΛࢀর͠ɺthen()ΛݺͿ jsContext .objectForKeyedSubscript("main")?.call(withArguments: [])? .invokeMethod("then", withArguments: [ JSValue(object: onFulfilled, in: jsContext)!, JSValue(object: onRejected, in: jsContext)! ]) // signal()͞ΕΔ·ͰεϨουΛఀࢭͯ͠ػ _ = semaphore.wait(timeout: .distantFuture)
22 JSコード実⾏部をContinuationでConcurrency化 εϨουͷϒϩοΫΛࢭ Copyright(C) 2 0 2 3 ALL RIGHTS
RESERVED, MedPeer, Inc. func run(code: String) async throws { return try await withCheckedThrowingContinuation { continuation in jsContext.evaluateScript(code) let semaphore = DispatchSemaphore(value: 0) ... _ = semaphore.wait(timeout: .distantFuture) continuation.resume() } }
23 まとめ JavaScriptCore.frameworkͰConcurrencyʹରԠͰ͖Δ JSValueʹൿີ͕͍ͬͺ͍ ΤϥʔϋϯυϦϯάʹ͍ͭͯฐࣾςοΫϒϩάʹॻ͘(༧ఆ) Copyright(C) 2 0 2 3
ALL RIGHTS RESERVED, MedPeer, Inc.
24 Copyright(C) 2 0 2 3 ALL RIGHTS RESERVED, MedPeer,
Inc.