Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
初めてOSSを読んでみた(Nuke)
Search
takattata
July 21, 2017
Programming
0
560
初めて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
910
Kotlinのコントリビュートに挑戦してみたよ!
takattata
3
300
導入画面を実装したよ
takattata
1
2k
AndroidXに移行しようと`してみた`!
takattata
2
730
Flutterテストことはじめ
takattata
1
820
Flutter
takattata
3
1.6k
ディープリンクを実装した
takattata
1
1.9k
introduce unit testing
takattata
1
580
xUnit Test Patterns の序章
takattata
1
370
Other Decks in Programming
See All in Programming
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
110
ViewファーストなRailsアプリ開発のたのしさ
sugiwe
0
470
Go コードベースの構成と AI コンテキスト定義
andpad
0
130
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
180
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
270
connect-python: convenient protobuf RPC for Python
anuraaga
0
410
30分でDoctrineの仕組みと使い方を完全にマスターする / phpconkagawa 2025 Doctrine
ttskch
4
870
TUIライブラリつくってみた / i-just-make-TUI-library
kazto
1
390
これだけで丸わかり!LangChain v1.0 アップデートまとめ
os1ma
6
1.8k
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
140
ローターアクトEクラブ アメリカンナイト:川端 柚菜 氏(Japan O.K. ローターアクトEクラブ 会長):2720 Japan O.K. ロータリーEクラブ2025年12月1日卓話
2720japanoke
0
730
SwiftUIで本格音ゲー実装してみた
hypebeans
0
380
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.8k
YesSQL, Process and Tooling at Scale
rocio
174
15k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Embracing the Ebb and Flow
colly
88
4.9k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Music & Morning Musume
bryan
46
7k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
For a Future-Friendly Web
brad_frost
180
10k
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等があったら ぜひ教えてください!