Swiftお久しぶりです。モバイルクライアントグループの若宮(id:D_R_100)です。Androidアプリ専任だったのですが、昨年11月ごろよりiOSアプリ開発にも参加するようになりました。今回は、iOSアプリに参加して取り組んでいたNukeによる画像読み込み処理改善についてまとめてみます。終わりに画像の読み込み事情Studyplusのクライアントアプリは画像の表示箇所が非常に多いアプリです。ユーザーアイコンや特集記事のアイキャッチ、連携しているアプリアイコンなど至る所に画像が存在しています。これらの画像は、それぞれのタイミングでSteakと呼ばれる社内システムから取得しています。サーバー側の実装については、過去のエントリをご参照ください。iOSアプリの歴史は古いため、もともと画像の読み込み処理を自前で実装していました。その名残で画面サイズに応じたリサイズ済みの画像をViewごとにリクエストしていました。いった事情の中、iOSアプリ開発に余剰な戦力として参加することになりました。AndroidではGlideを利用していた経験などもあったため、"お試し"で入っていたNukeをアプリ内で全面採用できるよう対応を進めるタスクに取り組みました。スタディプラスiOSアプリNukeはiOSアプリ開発で非常に人気のあるライブラリです。github.com余談となりますが、今回Nukeについていろいろと調べている時に下記のようなOSSライブラリを比較するページを見つけました。有名ライブラリの活発さを比較できるのは面白いですね。下記はKingfisherとNukeの比較ですが、単にGithubのリポジトリを見比べても気付きにくいところが比較できるので、選択のしやすさが高いなと感じます。開発を行うにあたりiOSのライブラリや既存コード、Androidライブラリの知見などを組み合わせて下記の方針を立てました。引数をとるイニシャライザを利用することで自動的に管理されることがわかりました。使いやすくすることで、メモリに優しい処理が自然と利用できるようにしました。frequently.それ以外の方針については、次の節からコードを参考に説明していきたいと思います。Nukeを呼び出すexクラスの作成スタディプラスiOSアプリでは、アプリ内で利用する拡張関数を作成する際、Extensionに名前空間を作成しています。これは意図しない関数の上書きを防ぐことや、コードの可読性をあげることを目的にしています。この手法は下記のような記事を参考に取り入れているものです。呼び出せるよう関数を追加しました。いうenumを作成しています。用いるケースが多いため、画像指定の分岐を吸収する関数を用意しています。サイズに応じたリサイズ処理を実施しています。サーバー側で実装していた画像のリサイズ処理をアプリ側に移譲することで、アプリ側でディスクキャッシュを利用するなどの機能改善の余地を作ることができました。続いてアプリ内でよく使う切り抜き処理などを加えた、汎用的なImageViewを作成します。引数としたUIImageが作成されるようになります。角に処理を加えています。いったImageViewの操作がiOSは対応しやすいので、大変感動しました。導入したことで、旧来の画像読み込み処理を素早く置き換えることができました。SwiftのコードをObjective-Cから呼び出すことで、手を出しづらかった歴史的なコードの改修ができるようになったことは、個人的なモチベーションの向上にもつながっています。その他には、一部の画像において旧来の処理よりも解像度がよくなったように見える箇所が存在しています。旧来のコードのリファクタリングは少々困難な状態にあったため、良い形でリプレースすることができました。終わりに今回が初めて業務でのiOS開発でした。SwiftやXcodeをはじめ戸惑うことは多かったのですが、Appleのドキュメントが非常に充実しており大変開発に取り組みやすかったです。Informationスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。