Presentation for iOS Creators' Meetup vol.4
@takattata初めてOSSを読んでみた(Nuke)
View Slide
高島 友里株式会社Cluex エンジニアゲームプログラマ→SIer→今最近リリースされたiOSアプリ「ままのて」にアサイン
最近のこと・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クラス)を読み込む箇所≠ UIImageschedulerは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等があったらぜひ教えてください!