このページの本文へ

データをダウンロードするiPhoneアプリ開発 (2/2)

2015年08月24日 12時05分更新

文●森 巧尚

  • この記事をはてなブックマークに追加
本文印刷

2.非同期ダウンロード

サーバーのデータをアプリに非同期ダウンロードするには、Swiftの命令「sendAsynchronousRequest」もしくは、「NSURLSession」を使います。

「NSURLSession」は何%ダウンロードしたかがわかり、アプリがバックグラウンドになっていてもダウンロードできます。大量のデータを読み込むときには、「NSURLSession」を使うといいでしょう。今回は、少量のデータなので、「sendAsynchronousRequest」を使います。

1)Xcodeのメニュー「File」→「New」→「Project」から「Single View Application」を選択して、新規プロジェクトを作成しましょう。

2)ダウンロード用のテキストデータ(UTF8)を、Webにアップします。テキストの中身はなんでも構いません。

※サンプルファイル http://editors.ascii.jp/c-minamoto/swift/swift-4-data.txt で代用できます。

3)画面に[textView]と[Button]を配置して、アプリ画面を作ります。

「Main.storyboard」を選択し、右下のライブラリから[Button]と[textView]をドラッグ&ドロップして配置します。 右下の「|△|」ボタンを押して、「Reset to Suggested Constraints(自動レイアウト設定)」を選択します。

4)[textView]に名前をつけてコントロールします。

メニュー「View」→「Assitant Editor」→「Show Assistant Editor」を選択して、「アシスタントエディター」を表示し、キーボードのcontrolを押しながら、[textView]をViewController.swiftへドラッグして、名前を「myTextView」とします。

5)ボタンが押されたときに実行される関数を作ります。

キーボードのcontrolを押しながら「Button」をViewController.swiftへドラッグし、「Connection」を「Action」に切り換えてボタンを押したとき実行する関数を作ります。関数名は「tapBtn」にします。

6)ViewController.swiftに、プログラムを記述します。

ボタンが押されたときにサーバーのデータを非同期ダウンロードするプログラムを記述します。

テキストデータのURLを用意して、「sendAsynchronousRequest」で非同期ダウンロードを実行します。データの読み込み完了の合図が来たら文字データに変換して、「myTextView」に表示します。先ほどの同期ダウンロードと同じように見えますが、非同期ダウンロードは少し複雑な書き方になります。いろいろな方法がありますが、この例では簡単なblock文を使った書き方で記述しています。

同期ダウンロード同様、処理の順番を確認するために、「読み込み後の処理」と「次の処理」を実行するところで「println文」を使ってデバッグエリアへテキストを出力します。

記述したプログラムは以下の通りです。


//(中略)
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myTextView: UITextView!
    @IBAction func tapBtn(sender: AnyObject) {
        // URLリクエストを作る(URLは適宜変更してください)
        let url = NSURL(string: "http://editors.ascii.jp/c-minamoto/swift/swift-4-data.txt")!
        let request = NSURLRequest(URL : url)
        // 非同期通信を開始
        NSURLConnection.sendAsynchronousRequest(request, queue: .mainQueue()) {
            (response, data, error) in
            if error == nil{
                if data != nil {
                    let myString = NSString(data:data!, encoding: NSUTF8StringEncoding) as! String
                    self.myTextView.text = myString
                    println("読み込み後の処理")
                }
            }
        }
        println("次の処理")
    }
//(中略)

ボタンを押すと、データが読み込まれ、textViewにテキストデータが表示されます。

Xcodeの下に表示されているデバッグエリアを確認してみましょう。

今度は「次の処理」が先に実行されて、その後「読み込み後の処理」が実行されたことがわかります。

非同期ダウンロードは、処理中も別の処理を実行しています。

サーバーからアプリへデータをダウンロードする方法を2つ紹介しました。

第1回のようにWebページを表示することでアプリの更新を簡単にする方法もありますが、サーバーからデータをダウンロードしてアプリを更新する方法もあります。今回紹介した非同期ダウンロードはユーザーが感じる操作スピードを向上できるため、ストレスなくアプリの操作ができる利点があります。

Swiftはサーバーデータのダウンロードも簡単です。更新時にレイアウト変更が発生するのならWebページを、情報の更新のみならサーバーのデータをダウンロードするなど状況に応じて使い分けてください。

前へ 1 2 次へ

この連載の記事

一覧へ

この記事の編集者は以下の記事をオススメしています