Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
初めてOSSを読んでみた(Nuke)
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
takattata
July 21, 2017
Programming
580
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
初めてOSSを読んでみた(Nuke)
Presentation for iOS Creators' Meetup vol.4
takattata
July 21, 2017
Transcript
25 slides
@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等があったら ぜひ教えてください!
More Decks by takattata
See All by takattata
What's DDD?
takattata
5
930
Kotlinのコントリビュートに挑戦してみたよ!
takattata
3
320
導入画面を実装したよ
takattata
1
2.1k
AndroidXに移行しようと`してみた`!
takattata
2
750
Flutterテストことはじめ
takattata
1
880
Flutter
takattata
3
1.7k
ディープリンクを実装した
takattata
1
1.9k
introduce unit testing
takattata
1
610
xUnit Test Patterns の序章
takattata
1
410
Other Decks in Programming
See All in Programming
作れるエンジニアから、価値を届けるエンジニアへ
ryunakayama
1
280
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
210
まずはコードより業務と向き合う:テーブル解体のためにPdMを呼んだ話
sakawe_ee
0
220
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.3k
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.2k
React Native経験者が Flutterを30⽇間触って驚いたこと
3saito
0
180
Spec-Driven Development - Why Vaadin Is the Perfect Fit
simas
PRO
0
250
止まらない比較を止める — 余帰納法で無限ストリームを比べる
tarao
0
120
Claude Code ハーネスDeep Dive – 君はどこまで制御する? -
takateeen_knj
6
5.7k
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
2.1k
Web3Dライブラリを作ってVue Custom Rendererの仕組みを理解しよう / lets learn vue custom renderer by making 3d library
drumath2237
1
130
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
170
Featured
See All Featured
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
560
WCS-LA-2024
lcolladotor
0
990
Designing Experiences People Love
moore
143
24k
Chasing Engaging Ingredients in Design
codingconduct
0
390
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
440
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
660
Designing for humans not robots
tammielis
254
26k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.7k
Odyssey Design
rkendrick25
PRO
3
940
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
530
Color Theory Basics | Prateek | Gurzu
gurzu
1
520