contenthello-world.jp.netwebエンジニアのメモ。投稿Tweet前回はAPIから取得したデータをTableViewに表示できるところまで作成しました。表示はできたもののTableViewをスクロールすると非常に動作が遅いという現象が発生しました。今回はその原因の調査と対応を行います。最初はViewController.swiftに書いたtableViewメソッドのdequeueReusableCellWithIdentifierメソッドが怪しいのではないかと思い、色々調べていたのですがよく分からなくなり挫折。cell}iosエンジニアの@ryusukefudaと@seiya_vwに助けを求め、ちらっとコードを見てもらったところ、カスタムセルを作っているLinkViewCellのsetCellメソッド内で同期処理で画像を読み込もうとしているのが原因だと判明しました。}}今回、200件分の画像取得をメインスレッド内ですべて行おうとしていたため、画像を読み込みつつスクロールをしようとしてiPhoneが固まったような現象が発生してしまったようです。これはアプリ開発初心者がよくハマるポイントらしく、見事にひっかかってしまいました。このような画像表示処理を行う場合は別スレッドにして非同期処理で行う必要がありました。原因は分かったので、続いては画像表示処理を非同期で行うようコードを修正します。画像表示を非同期で行う方法は色々あるらしいのですが、SDWebImageというライブラリを使うのがオススメと教えてもらったのでこちらを使うことにしました。SDWebImageのインストールPodfileにSDWebImageを追加します。Libraries」の「+」を選択し、SDWebImageを追加します。これでSDWebImageをXcode上に読み込むことができました。swiftからSDWebImageが使えるようにライブラリを読み込むところまではできたのですが、SDWebImageはObjective-Cで書かれたライブラリのため、swift経由で利用するにはBridging-Headerという仕組みを利用する必要があります。Bridging-Headerに関しては下記のクックパッドさんのブログが参考になると教えてもらいました。クックパッド開発者ブログこちらの記事を参考にさせていただき設定していきます。File」を選択します。続いてファイル名を「プロジェクト名-Bridging-Header.h」とします。今回の場合だとプロジェクト名が「weeqiita」のため「weeqiita-Bridging-Header.h」となります。Headerファイルを追加したら、SDWebImageのimport設定をHeaderファイルに記述します。Settings」を変更します。existというエラーが出た場合は、ファイルのパスが間違っているので正しいパスを確認します。この時点でビルドが成功すればSDWebImageのインポートは正しく行えています。SDWebImageを使って非同期に画像取得を行うようにいよいよ仕上げです。LinkViewCellのsetCellメソッドで設定している、userIconの取得部分をsd_setImageWithURLメソッドに置き換えます。}}SDWebImageを使うと非同期画像取得が1行で書けるので非常にお手軽ですね。上記に変更した状態でビルドを行うと、スムーズなスクロールでTableViewを表示することができるようになりました。次回からはこれを忘れないようにします。次回はレイアウトの調整を行います。Amazonアソシエイト・プログラムの参加者です。