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
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
900
Kotlinのコントリビュートに挑戦してみたよ!
takattata
3
300
導入画面を実装したよ
takattata
1
2k
AndroidXに移行しようと`してみた`!
takattata
2
720
Flutterテストことはじめ
takattata
1
820
Flutter
takattata
3
1.6k
ディープリンクを実装した
takattata
1
1.9k
introduce unit testing
takattata
1
580
xUnit Test Patterns の序章
takattata
1
360
Other Decks in Programming
See All in Programming
PostgreSQLで手軽にDuckDBを使う!DuckDB&pg_duckdb入門/osk2025-duckdb
takahashiikki
1
240
(Extension DC 2025) Actor境界を越える技術
teamhimeh
1
220
iOS 17で追加されたSubscriptionStoreView を利用して5分でサブスク実装チャレンジ
natmark
0
580
AIエージェント時代における TypeScriptスキーマ駆動開発の新たな役割
bicstone
4
1.5k
Web技術を最大限活用してRAW画像を現像する / Developing RAW Images on the Web
ssssota
2
1.2k
Pythonスレッドとは結局何なのか? CPython実装から見るNoGIL時代の変化
curekoshimizu
4
1.3k
Railsだからできる 例外業務に禍根を残さない 設定設計パターン
ei_ei_eiichi
0
190
CSC509 Lecture 05
javiergs
PRO
0
290
AIで開発生産性を上げる個人とチームの取り組み
taniigo
0
130
階層構造を表現するデータ構造とリファクタリング 〜1年で10倍成長したプロダクトの変化と課題〜
yuhisatoxxx
3
910
育てるアーキテクチャ:戦い抜くPythonマイクロサービスの設計と進化戦略
fujidomoe
1
150
Le côté obscur des IA génératives
pascallemerrer
0
120
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
237
140k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
114
20k
We Have a Design System, Now What?
morganepeng
53
7.8k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
61k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
For a Future-Friendly Web
brad_frost
180
9.9k
The Pragmatic Product Professional
lauravandoore
36
6.9k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.6k
Designing for Performance
lara
610
69k
A Tale of Four Properties
chriscoyier
160
23k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
20k
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等があったら ぜひ教えてください!