@m_seki の

I like ruby tooから引っ越し

HKQueryAnchorの永続化についてのメモ

HKQueryAnchorの永続化のメモだよ

先日のHealthKitの練習のときのメモ。HealthKitのデータには登録順にアンカーと呼ばれる整数のようなものがつけられています。これを使うと前回読んだ事実(データ)よりもあとに増えた事実を集める処理が書きやすいです。Dripのキーに近い。

つまづき

アンカーはHKQueryAnchorのインスタンスです。作るときはこんな風にしました。

myAnchor = HKQueryAnchor.init(fromValue: 0)

整数から作れるのね。よしよし。整数にして保存しようっと...と思って困ったのは整数化するインターフェイスがないところ。
NSLogとかでデバッグプリントするときは内部の整数風の値を見ることができるけど、整数を取ることはできないみたい。

これはめんどくさい予感。

永続化

HKQueryAnchorから整数を取り出すのではなく、NSKeyedArchiver.archivedDataを使うのが正解みたい。UserDefaultsに保存するときはこうか?

    func saveAnchor() {
        do {
            let data = try NSKeyedArchiver.archivedData(withRootObject: self.myAnchor, requiringSecureCoding: true)
            let defaults = UserDefaults.standard
            defaults.set(data, forKey: "anchor")
        } catch {
            NSLog("encode failed")
        }
    }

失敗してもできることがないから、catchしなくてもいいくらいなんだけどどうするのが良いんだろ。

読み出しも同じようにした。

    func initHK() {
        // ...
        myAnchor = HKQueryAnchor.init(fromValue: 0)
        let defaults = UserDefaults.standard
        guard let it = defaults.data(forKey: "anchor") else { return }
        do {
            myAnchor = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(it) as? HKQueryAnchor
        } catch {
            // nop
        }
    }

まだSwiftの?や!やtryの気持ちがわかってない。コード片も自信がない。

まとめ

自分なら整数か文字列にすると思う。けち。