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
0
550
初めてOSSを読んでみた(Nuke)
Presentation for iOS Creators' Meetup vol.4
takattata
July 21, 2017
Tweet
Share
More Decks by takattata
See All by takattata
What's DDD?
takattata
5
900
Kotlinのコントリビュートに挑戦してみたよ!
takattata
3
300
導入画面を実装したよ
takattata
1
2k
AndroidXに移行しようと`してみた`!
takattata
2
720
Flutterテストことはじめ
takattata
1
810
Flutter
takattata
3
1.6k
ディープリンクを実装した
takattata
1
1.8k
introduce unit testing
takattata
1
580
xUnit Test Patterns の序章
takattata
1
360
Other Decks in Programming
See All in Programming
それ CLI フレームワークがなくてもできるよ / Building CLI Tools Without Frameworks
orgachem
PRO
17
3.8k
Google I/O Extended Incheon 2025 ~ What's new in Android development tools
pluu
1
270
202507_ADKで始めるエージェント開発の基本 〜デモを通じて紹介〜(奥田りさ)The Basics of Agent Development with ADK — A Demo-Focused Introduction
risatube
PRO
6
1.4k
0から始めるモジュラーモノリス-クリーンなモノリスを目指して
sushi0120
0
280
No Install CMS戦略 〜 5年先を見据えたフロントエンド開発を考える / no_install_cms
rdlabo
0
480
プロダクトという一杯を作る - プロダクトチームが味の責任を持つまでの煮込み奮闘記
hiliteeternal
0
450
Scale out your Claude Code ~自社専用Agentで10xする開発プロセス~
yukukotani
9
1.9k
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
240
[DevinMeetupTokyo2025] コード書かせないDevinの使い方
takumiyoshikawa
2
280
Bedrock AgentCore ObservabilityによるAIエージェントの運用
licux
9
620
SwiftでMCPサーバーを作ろう!
giginet
PRO
2
230
AIコーディングエージェント全社導入とセキュリティ対策
hikaruegashira
16
9.7k
Featured
See All Featured
Scaling GitHub
holman
461
140k
Balancing Empowerment & Direction
lara
1
540
The Art of Programming - Codeland 2020
erikaheidi
54
13k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
183
54k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Typedesign – Prime Four
hannesfritz
42
2.8k
Mobile First: as difficult as doing things right
swwweet
223
9.9k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
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等があったら ぜひ教えてください!