Firebase の Realtime Database を使ってみる。Swift版

  • 58
    いいね
  • 0
    コメント

Realtime Database

FirebaseのNoSQL JSON データベースです。リアルタイムとオフラインの両方をサポートしています。
クラウド上のデータを変更すると、リアルタイムにオブザーブしているすべてのクライアントにイベントが通知されます。(コールバックで書けます。)オフラインの場合は、ローカルのキャッシュやパーシステントDBに保存します。

このページはFirebase社のDavidさんのビデオに基づいてます。
https://www.youtube.com/watch?v=joVi3thZOqc
https://www.youtube.com/watch?v=cYinms8LurA

Firebase

Podでプロジェクトを作成するまではkoogawaさんのページをご覧ください。

pod init

Podfile
  pod 'Firebase'
  pod 'Firebase/Database'

pod install

workspaceを開きます。

AppDelegateを以下のように修正します。

AppDelegate.swift
import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        FIRApp.configure() // この行を追加

        return true
    }

ViewControllerを以下のように修正します。

ViewController.swift
import UIKit
import Firebase

class ViewController: UIViewController {
    // データベースへの参照
    let rootRef = FIRDatabase.database().reference()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        // 子ノード condition への参照
        let conditionRef = rootRef.child("condition")
        // クラウド上で、ノード condition に変更があった場合のコールバック処理
        conditionRef.observe(.value) { (snap: FIRDataSnapshot) in
            print("ノードの値が変わりました!: \((snap.value as AnyObject).description)")
        }
    }
}

Firebaseコンソールから、Databaseを開きます。

Screen Shot 2016-05-22 at 7.59.28 PM.png

+アイコンをクリックし、ノード condition を追加します。値も適当に設定します。(Sunny)

Screen Shot 2016-05-22 at 8.00.06 PM.png

ルールタブを開きます。アクセス権限をtrueに変更し、誰でも読み書きできるようにします。

Screen Shot 2016-05-22 at 8.03.20 PM.png

Xcodeで、アプリを実行します。

Firebaseコンソールから、conditionの値を適当に変更してください。(Rain)

Screen Shot 2016-05-22 at 8.24.51 PM.png

Xcodeのコンソールに、変更が出力されます。

ノードの値が変わりました!: Optional("Optional(Snow)")

次に、プログラムからデータベースの値を更新します。

適当にボタンを配置して、アクションを下記のように実装します。

ViewController.swift
    @IBAction func theButton(sender: UIButton) {
        let conditionRef = rootRef.child("condition")
        conditionRef.setValue("Snow")
    }

ボタンを押すと、リアルタイムにサーバの値が変わり、その結果、先ほどのコールバックが呼ばれて、Xcodeのコンソールにログが出力されます。

追記

Xcode8で、
Failed to fetch default token Error Domain=com.firebase.iid Code=6
が出る場合、TARGETS > Keychain SharingON にします。

一覧を初期表示とかで、一回だけ取得したい時、observeSingleEventでごそっとデータを持ってこれる。子ノードで絞りたいときは、rootRef.child('coutries').child('cities')

rootRef.observeSingleEvent(of: .value, with: { (snapshot) in
    // Get user value
    let value = snapshot.value as? NSDictionary
    print("value \(value)")