iPhoneアプリのサクサク感が出ない件について

先週は、製作中のアプリが画面遷移が遅かったり、操作がひっかかかる状態でしたが、今週3日ほどかけて幾つか修正をおこないました。先週の仮説から、画面遷移・サーバ通信・画面表示といった行程で分けて一つ一つ原因を見ていったのですが、ブラウザ上のWebサービスでは気にしていなかったような点で原因がありました。


描画はメインスレッドで行う

まずはこの参考サイトをdispatch_asyncでバックグラウンドタスクを読んでいただきたいのですが、GCDライブラリが紹介されています。GCDが直接関係するというわけではないのですが、この中に本件の解決策の手かかりがあります。キーワードはメインスレッドです。メインスレッドの存在を考慮していないことが、操作の引っ掛かりの原因の一つでした。メインスレッド以外のスレッドで描画に関する処理を行ってはいけません。このことを理解していなかったので、非同期でサーバ通信したり、DBからの大量データ取得を別スレッドに移しても、引っ掛かりが発生していました。

Swiftで書くとこんな感じになるかと思います

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)){
    // 裏で重い処理
    dispatch_async(dispatch_get_main_queue()) {
        // 描画はメインスレッド
    }
}

GCDについては、ここもわかりやすいです。
【iPhoneアプリ】これを使えるようにならないと「マルチスレッド」について 実装編

Webアプリでは

以前「FacebookのザッカーバーグCEO、「HTML5に賭けたのは失敗」 Androidアプリも間もなくネイティブに」という話題の時に、HTML5でもサクサク感が出せるという反論がありました。今見直すと「レンダリング処理のほうがずっと重要」とか「GPU関連がHTML5での核心」ということがすでに書いていあります。当時は、描画に関して考慮する事が複雑すぎて実業務では無理と考えていたのですが、HTMLでも考えないといけないことは同じだったようです。