Upgrade to Pro — share decks privately, control downloads, hide ads and more …

初めてOSSを読んでみた(Nuke)

 初めてOSSを読んでみた(Nuke)

Presentation for iOS Creators' Meetup vol.4

takattata

July 21, 2017
Tweet

More Decks by takattata

Other Decks in Programming

Transcript

  1. @takattata
    初めてOSSを読んでみた(Nuke)

    View Slide

  2. 高島 友里
    株式会社Cluex エンジニア
    ゲームプログラマ→SIer→今
    最近リリースされたiOSアプリ
    「ままのて」にアサイン

    View Slide

  3. 最近のこと
    ・1ヶ月前からiOSに移行
    ・課題として簡単な「お天気アプリ」を作成
    ・「ままのて」のタスクにアサイン
    ・Twitterで@_monoさんが「Nukeはお手本の様だ」と仰っていた
    → 勉強にNuke読んでみよー

    View Slide

  4. 最近のこと
    ・1ヶ月前からiOSに移行
    ・課題として簡単な「お天気アプリ」を作成
    ・「ままのて」のタスクにアサイン
    ・Twitterで@_monoさんが「Nukeはお手本の様だ」と仰っていた
    → 勉強にNuke読んでみよー

    View Slide

  5. Nukeって?

    View Slide

  6. Nukeとは
    アプリで画像を簡単に読み込むこと
    ができるSwiftで書かれたフレームワーク
    画像読み込みとキャッシュを良い感じにして
    くれる

    View Slide

  7. ソース
    12ファイル

    View Slide

  8. 実際に使ってみた様子を追ってみる
    (※それ違うよ〜という箇所ありましたら、ぜひつっこんでください!!)
    ↓UIImageView
    ↓URL

    View Slide

  9. Nuke.swift
    <概要>
    外部から呼ぶloadImage関数
    loadImage関数は合計4種類ある

    View Slide

  10. Manager.swift
    <概要>
    Nuke.loadImage関数から
    呼ばれる管理クラス
    UIImageを取得できた直後に実行する関数を
    設定できる(例えば角丸つける為にフィルタ掛ける)
    cf.) 本家README
    デフォルトではDecompressorが呼ばれる(軽く後述)

    View Slide

  11. →デフォルトだと初回読み込み時にフェードイン
    →自分で定義できる様になってる cf.) 本家README
    ※Image, ImageViewはUIImageのtypealias
    [脇道]

    View Slide

  12. 流れに戻る

    View Slide

  13. →ランタイムAPI:既存のクラスに動的にプロパティを取得/設定する
    →CancellationTokenSourceクラス
    ・cancel時に実行したい関数を追加出来る(register関数)
    ・cancel関数では、追加されていた関数を全て実行する
    ・排他ロックした状態で関数を実行出来る
    [脇道]

    View Slide

  14. 再度、戻って見てみる

    View Slide

  15. →cacheはCacheクラス(定義はCachingプロトコル)
    ※画像読み込みの後に説明
    →非同期実行で画像読み込みする
    (先ほどのhandlerの実行も完了時に非同期で実行される)
    キャッシュされていない時の画像読み込みを引き続き追う

    View Slide

  16. →非同期で実行されている為、再確認
    ↓先に画像読み込み成功時にキャッシュに追加している箇所
    →loaderはLoaderクラス
    (定義はLoadingプロトコル)

    View Slide

  17. Loader.swift
    <概要>
    1. 画像読み込み、
    2. 読み込み後のデコード、
    3. デコード後に実行する関数
    をスレッドセーフで実行させる
    loaderはDataLoaderクラス
    (定義はDataLoadingプロトコル)

    View Slide

  18. DataLoader.swift
    <概要>
    実際に画像(Dataクラス)を
    読み込む箇所
    ≠ UIImage
    schedulerはOperationQueueSchedulerクラス
    (定義はAsyncSchedulerプロトコル)
    →OperationQueueを使って、スレッドセーフなマル
    チスレッド処理を実装している
    (デフォルトでスレッド数6まで並行に走る)
    taskはURLSession

    View Slide

  19. →DispatchQueueScheduler: executeする時にDispatchWorkItemを使う
    制御を細かく行なえる様になり、cancel関数が呼べる様になる
    (= まだ実行されていないものに対して実行を中止できる)
    →decorderはDataDecoderクラス
    (定義はDataDecodingプロトコル)
    decode関数でUIImageに変換して返している
    Loader.swiftに戻って、

    View Slide

  20. →始めの方のRequestの説明であった、UIImage取得後に呼ばれる関数はココのこと
    を指している
    デフォルトではDecompressor: 圧縮された画像(JPEG等)をバックグラウンドでよしな
    にしてくれて、描画パフォーマンスを爆上げしてくれるそう(理解弱)

    View Slide

  21. Cache.swift
    <概要>
    Requestをキーにハッシュを作り、ハッ
    シュとUIImageを持った辞書と、双方向
    リストを使ってスレッドセーフに
    UIImageを返す
    Managerクラスでcache?[request]と配列の様に使
    えてたのはここのsubscriptによるもの
    listは限界を超えた時に、使ってないものから解
    放していくために使う(後述)

    View Slide

  22. →最近使用した順にしたいので、
    先頭に入れ直す
    →setする値にnilが来たら
    map, listから取り除く

    View Slide

  23. →addする毎に保持しておいている
    totalCostが限界値より大きければ最後尾か
    ら取り除く(デフォルト物理メモリ20%)
    →mapの要素数が限界値より大きければ
    最後尾から取り除く(デフォルトInt.max)

    View Slide

  24. ・ライブラリ特有の関数や書き方を学べた
    ・swiftの言語的なところを学べた
    →UIKitとかiOS関連の部分を次は学びたい(そういう系のOSS探す)
    ・他をまだ知らないけれど、初めてOSS読むならおすすめだと思う
    (コメントが分かりやすい, ファイル少なめ, コード綺麗)
    ・Testsフォルダ見てないのでテストについて勉強しながら読みたい
    ・理解弱いところあるので、もう少し読みこもうと思う
    所感

    View Slide

  25. ありがとうございました!
    「これ勉強になるよー」というサイトや本, OSS等があったら
    ぜひ教えてください!

    View Slide