SwiftでBackendlessのストレージから非同期にデータ取得

#背景

[Parse.comの終了がアナウンスされた](http://blog.parse.com/announcements/moving-on/)ことに伴い、その移行先として[Backendless](https://backendless.com/)を独習しようと思いましたので、その技術的メモを記録を残していきたいと思います（汎用性や可読性はほとんど考慮していませんので、ご了承ください）。

Backendlessに関する日本語のドキュメント/記載（とくにSwift関連）を現時点ではあまり見つけられず（[Backendless.jp](http://backendless.jp/)内には[日本語のページはあっても内容が古そう](http://backendless.jp/backend-as-a-service/quick-start-guide-for-ios/)なので参考にしづらく、また英語サイトへのリンクが多数はられている）、今回参考にしたページは以下のものです。

記事1. [Swift examples (Backendless Support)](http://support.backendless.com/topic/swift-examples)
記事2. [Blog a Feature a Day Challenge](https://backendless.com/blog-a-feature-a-day-challenge/)
記事3. [Feature 16: Data retrieval API – how to load objects from an mBaaS storage](https://backendless.com/feature-16-data-retrieval-api-how-to-load-objects-from-an-mbaas-storage/) ←これがメイン

上記の記事1でBackendlessの中の人が「Swiftのサンプルについては（まだまとまってないけど）こっちの記事(記事2)を見てよ」と書いていたので、記事2にある記事リストのなかから、ストレージ検索に関する記事(記事3、Swiftによる記載あり)を参考にしました。そのほかにも、Swiftによる記載がある記事もけっこうありそうです。

#動作環境
XCode 7.2
Backendless SDK for iOS v3.0.5

#準備
##1) Backendless SDK for iOSのインストール
XCodeで空のプロジェクトを作成後、Cocoapodsを使用してインストールしました。

```Podfile
platform :ios, '9,0'
pod 'Backendless-ios-SDK', '~>3.0.0'
```

これについては、[公式サイト上の記載](https://backendless.com/mobile-developers/quick-start-guide-for-ios/)**ではなく**、[zipでダウンロードできるSDK](https://backendless.com/sdk/ios/3.0.5/BackendlessSDK_iOS+OSX.zip)のなかにあるPDFファイルの記載を参照しました（バージョン表記のみ最新＝３としました。[GitHub](https://github.com/Backendless/ios-SDK)参照でもいいかも）。

##2) ストレージの準備
Backendlessの管理画面で、あらかじめストレージを用意しておきました。今回はテストなので、

テーブル名：Testtable
追加したカラム：title

これのみです。また、適当にデータを入れておきました（2行、title="テストタイトル１"、"テストタイトル２"）。

##3) アプリケーションID、iOSシークレットキーの確認
同じくBackendlessの管理画面の、管理->アプリ設定の画面で、アプリケーションID、iOSシークレットキーを確認しておきます。

準備はここまで。

#XCode側でのSwiftによる記載

##1) ストレージに該当するクラス定義

```swift:Testtable.swift
class Testtable: NSObject {
    var objectId : String?
    var created : NSDate?
    var updated : NSDate?
    var ownerId : String?

    var title : String?  //ユーザー定義カラム
}
```

##2) データ取得

```swift:AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    // Backendless関連
    let BACKENDLESS_APP_ID = "(上記アプリケーションID)"
    let BACKENDLESS_SECRET_KEY = "(上記iOSシークレットキー)"
    let BACKENDLESS_VERSION_NUM = "v1"
    var backendless = Backendless.sharedInstance()

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        // Backendless初期化
        backendless.initApp(BACKENDLESS_APP_ID, secret:BACKENDLESS_SECRET_KEY, version:BACKENDLESS_VERSION_NUM)
        
        // Backendlessからデータ取得
        let startTime = NSDate()        
        backendless.persistenceService.of(Testtable.ofClass()).find(
            BackendlessDataQuery(),
            response: { ( testtable : BackendlessCollection!) -> () in
                let currentPage = testtable.getCurrentPage()
                print("Loaded \(currentPage.count) testtable objects")
                print("Total testtable in the Backendless starage - \(testtable.totalObjects)")
                for data in currentPage {
                    print("testdata title = \(data.title)")
                }
                print("Total time (ms) - \(1000*NSDate().timeIntervalSinceDate(startTime))")
            },
            error: { ( fault : Fault!) -> () in
                print("Server reported an error: \(fault)")
        })
        print("appli start")
        return true
    }

(以下略)

}
```

これを実行してコンソールに以下のように表示されました。

```
appli start
Loaded 2 testtable objects
Total testtable in the Backendless starage - 2
testdata title = Optional("テストタイトル２")
testdata title = Optional("テストタイトル１")
Total time (ms) - 1215.744972229
```

これでBackendlessのストレージからデータが非同期で取得できていることが確認できました。

#今後
今回はテストなので全部AppDelegate.swift内に書きましたが、ロジック部分については本来は適宜ViewControllerなどに書くべきでしょう。

まだ自分自身Swiftに関しても日が浅く、Backendlessについても上記記事3の記載をほぼそのまま写しただけなのでAPIなどもまだ理解しきれていない部分も多々あります。今後少しずつ積み重ねていければと思います。