2017年9月3日日曜日

SpriteKit で Realm を使ってみる

概要

前回 SpriteKit で UserDefaults の使い方を紹介しました
実は UserDefaults には罠があってアプリを更新するとデータが消えてしまいます
なので、アプリが更新した際にデータが来ててほしくないようなデータを UserDefaults で管理すると大変なことになります
ということで今回は SpriteKit で Realm を使ってみました

環境

  • macOS X 10.12.6
  • Xcode 8.3.3 (8E3004b)
  • RealmSwift 2.8.3

ライブラリインストール

  • vim Podfile
pod 'RealmSwift'
  • pod install

Score.swift を作成

データを管理するクラスを作成します

import RealmSwift

class Score: Object{
    dynamic var name: String? = nil
    dynamic var score = 0
    dynamic var created = Date()
}

データを保存する関数をシーンファイルに追記

データを保存する関数を追加します
シーンファイルで定義するのが良いと思います

func insert() {
    let score: Score = Score()
    score.name = "hoge"
    score.score = 100
    score.created = Date()
    let realm = try! Realm()
    try! realm.write {
        realm.add(score)
    }
}

データを取得する関数をシーンファイルに追加

今度は取得する関数を定義します

func select() {
    let realm = try! Realm()
    let scoreList = realm.objects(Score.self).filter("score > 0").sorted(byKeyPath: "score", ascending: false)
    print(scoreList)
}

取得する条件はスコアが 0 以上かつスコアの大きい順となります
scoreList[0] とすれば最高スコアを取得することができます

ちなみに RealmSwift ではメソッドチェーンにより複数カラムでのソートはサポートしておらず例えば .sorted(byKeyPath: "created", ascending: false) を追加して作成日時でもソートしたいと思ってもできません

どうやらその場合は SortDescriptor を使ってソートするようです

追加した関数をコールする

あとはシーンファイルの touchDown などでノードを判定してコールするだけです

func touchDown(atPoint pos : CGPoint) {
    if let node = atPoint(pos) as? SKSpriteNode {
        if(node == show){
            if let _ = self.view {
                select()
            }
        } else if(node == save){
            if let _ = self.view {
                insert()
            }
        }
    }
}

動作確認

ちゃんとデータが保存されていると取得した際にコンソールに以下のようなデータ表示されるはずです

Results<Score> (
    [0] Score {
        name = hoge;
        score = 100;
        created = 2017-09-02 06:04:07 +0000;
    },
    [1] Score {
        name = hoge;
        score = 100;
        created = 2017-09-02 06:04:06 +0000;
    },
    [2] Score {
        name = hoge;
        score = 100;
        created = 2017-09-02 06:03:55 +0000;
    },
    [3] Score {
        name = hoge;
        score = 100;
        created = 2017-09-02 06:03:54 +0000;
    },
    [4] Score {
        name = hoge;
        score = 100;
        created = 2017-09-02 06:03:53 +0000;
    }
)

最後に

SpriteKit で Realm を使ってみました
結構簡単に使える感じです
気になったのはライブラリ自体のサイズがかなり大きそうなのでこれを使うだけで ipa ファイルの容量が増えそうです

SpriteKit では CoreData がなかなか難しいのでそういった意味では代替として Realm を採用するのには良いと思います

参考サイト

1 件のコメント:

  1. 別のクラスから参照する場合は static を付与してください

    返信削除