概要
前回 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 を採用するのには良いと思います
別のクラスから参照する場合は static を付与してください
返信削除