LoginSignup
73
76

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-22

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)")
73
76
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
76