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
Concurrency in JavaScriptCore.framework
Search
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
530
UICollectionViewCompositionalLayoutできれいなGrid Layoutをつくる
imk2o
1
1k
Other Decks in Technology
See All in Technology
そこにあるから地図ができる~位置を示す"モノ"を愉しむ~ - Interface 2026年6月号GPS特集オフ会 / interface_202606_GPS_offline
sakaik
1
110
2026 AI Memory Architecture
nagatsu
0
530
Amazon Redshift zero-ETL 統合を活用した軽量なマルチプロダクトデータ可視化基盤 / Lightweight Multi-Product Data Visualization with Amazon Redshift Zero-ETL
kaminashi
0
110
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
10
2.6k
打造你的 AI 工作流:Agent Skill + MCP 實戰工作坊
appleboy
0
100
從開發到部署全都交給 AI:實作 AI 驅動的自動化流程
appleboy
0
180
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
3
860
MySQL & MySQL HeatWave Report - June 2026
freshdaz
0
190
組織における AI-DLC 実践
askul
0
140
#エンジニアBooks 30分でわかる 「技術記事を書く技術」 / engineer-books 2026-06-30
jnchito
1
120
水を運ぶ人としてのリーダーシップ
izumii19
4
1k
AIエージェントとPhysical AIが拓く製造業の変革(ハノーバーメッセリキャップ)
iotcomjpadmin
0
160
Featured
See All Featured
Thoughts on Productivity
jonyablonski
76
5.2k
The agentic SEO stack - context over prompts
schlessera
0
830
Balancing Empowerment & Direction
lara
6
1.2k
The Curious Case for Waylosing
cassininazir
1
400
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
580
A better future with KSS
kneath
240
18k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
210
How GitHub (no longer) Works
holman
316
150k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The Cost Of JavaScript in 2023
addyosmani
55
10k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
150
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.