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
初めてOSSを読んでみた(Nuke)
Search
takattata
July 21, 2017
Programming
570
0
Share
初めてOSSを読んでみた(Nuke)
Presentation for iOS Creators' Meetup vol.4
takattata
July 21, 2017
More Decks by takattata
See All by takattata
What's DDD?
takattata
5
920
Kotlinのコントリビュートに挑戦してみたよ!
takattata
3
300
導入画面を実装したよ
takattata
1
2k
AndroidXに移行しようと`してみた`!
takattata
2
740
Flutterテストことはじめ
takattata
1
860
Flutter
takattata
3
1.6k
ディープリンクを実装した
takattata
1
1.9k
introduce unit testing
takattata
1
600
xUnit Test Patterns の序章
takattata
1
390
Other Decks in Programming
See All in Programming
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
2.4k
tsserverとは何だったのか、これからどうなるのか
nowaki28
1
440
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
140
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
710
RTSPクライアントを自作してみた話
simotin13
0
440
ビジネスモデルから紐解く、AI+型駆動開発
hirokiomote
2
5.2k
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
190
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
230
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
450
権限チェックの一貫性を型で守る TypeScript による多層防御
mnch
4
1.1k
GitHub Copilot CLIのいいところ
htkym
2
1.3k
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
800
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
220
Marketing to machines
jonoalderson
1
5.3k
Mind Mapping
helmedeiros
PRO
1
230
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
590
Producing Creativity
orderedlist
PRO
348
40k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Designing for humans not robots
tammielis
254
26k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
210
For a Future-Friendly Web
brad_frost
183
10k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
Transcript
@takattata 初めてOSSを読んでみた(Nuke)
高島 友里 株式会社Cluex エンジニア ゲームプログラマ→SIer→今 最近リリースされたiOSアプリ 「ままのて」にアサイン
最近のこと ・1ヶ月前からiOSに移行 ・課題として簡単な「お天気アプリ」を作成 ・「ままのて」のタスクにアサイン ・Twitterで@_monoさんが「Nukeはお手本の様だ」と仰っていた → 勉強にNuke読んでみよー
最近のこと ・1ヶ月前からiOSに移行 ・課題として簡単な「お天気アプリ」を作成 ・「ままのて」のタスクにアサイン ・Twitterで@_monoさんが「Nukeはお手本の様だ」と仰っていた → 勉強にNuke読んでみよー
Nukeって?
Nukeとは アプリで画像を簡単に読み込むこと ができるSwiftで書かれたフレームワーク 画像読み込みとキャッシュを良い感じにして くれる
ソース 12ファイル
実際に使ってみた様子を追ってみる (※それ違うよ〜という箇所ありましたら、ぜひつっこんでください!!) ↓UIImageView ↓URL
Nuke.swift <概要> 外部から呼ぶloadImage関数 loadImage関数は合計4種類ある
Manager.swift <概要> Nuke.loadImage関数から 呼ばれる管理クラス UIImageを取得できた直後に実行する関数を 設定できる(例えば角丸つける為にフィルタ掛ける) cf.) 本家README デフォルトではDecompressorが呼ばれる(軽く後述)
→デフォルトだと初回読み込み時にフェードイン →自分で定義できる様になってる cf.) 本家README ※Image, ImageViewはUIImageのtypealias [脇道]
流れに戻る
→ランタイムAPI:既存のクラスに動的にプロパティを取得/設定する →CancellationTokenSourceクラス ・cancel時に実行したい関数を追加出来る(register関数) ・cancel関数では、追加されていた関数を全て実行する ・排他ロックした状態で関数を実行出来る [脇道]
再度、戻って見てみる
→cacheはCacheクラス(定義はCachingプロトコル) ※画像読み込みの後に説明 →非同期実行で画像読み込みする (先ほどのhandlerの実行も完了時に非同期で実行される) キャッシュされていない時の画像読み込みを引き続き追う
→非同期で実行されている為、再確認 ↓先に画像読み込み成功時にキャッシュに追加している箇所 →loaderはLoaderクラス (定義はLoadingプロトコル)
Loader.swift <概要> 1. 画像読み込み、 2. 読み込み後のデコード、 3. デコード後に実行する関数 をスレッドセーフで実行させる loaderはDataLoaderクラス
(定義はDataLoadingプロトコル)
DataLoader.swift <概要> 実際に画像(Dataクラス)を 読み込む箇所 ≠ UIImage schedulerはOperationQueueSchedulerクラス (定義はAsyncSchedulerプロトコル) →OperationQueueを使って、スレッドセーフなマル チスレッド処理を実装している
(デフォルトでスレッド数6まで並行に走る) taskはURLSession
→DispatchQueueScheduler: executeする時にDispatchWorkItemを使う 制御を細かく行なえる様になり、cancel関数が呼べる様になる (= まだ実行されていないものに対して実行を中止できる) →decorderはDataDecoderクラス (定義はDataDecodingプロトコル) decode関数でUIImageに変換して返している Loader.swiftに戻って、
→始めの方のRequestの説明であった、UIImage取得後に呼ばれる関数はココのこと を指している デフォルトではDecompressor: 圧縮された画像(JPEG等)をバックグラウンドでよしな にしてくれて、描画パフォーマンスを爆上げしてくれるそう(理解弱)
Cache.swift <概要> Requestをキーにハッシュを作り、ハッ シュとUIImageを持った辞書と、双方向 リストを使ってスレッドセーフに UIImageを返す Managerクラスでcache?[request]と配列の様に使 えてたのはここのsubscriptによるもの listは限界を超えた時に、使ってないものから解 放していくために使う(後述)
→最近使用した順にしたいので、 先頭に入れ直す →setする値にnilが来たら map, listから取り除く
→addする毎に保持しておいている totalCostが限界値より大きければ最後尾か ら取り除く(デフォルト物理メモリ20%) →mapの要素数が限界値より大きければ 最後尾から取り除く(デフォルトInt.max)
・ライブラリ特有の関数や書き方を学べた ・swiftの言語的なところを学べた →UIKitとかiOS関連の部分を次は学びたい(そういう系のOSS探す) ・他をまだ知らないけれど、初めてOSS読むならおすすめだと思う (コメントが分かりやすい, ファイル少なめ, コード綺麗) ・Testsフォルダ見てないのでテストについて勉強しながら読みたい ・理解弱いところあるので、もう少し読みこもうと思う 所感
ありがとうございました! 「これ勉強になるよー」というサイトや本, OSS等があったら ぜひ教えてください!