tomoyasuzuki / StoreData

0 stars 0 forks source link

NSCoder #3

Open tomoyasuzuki opened 4 years ago

tomoyasuzuki commented 4 years ago

How To Use

encode → save → retrive → decode の流れ。 コードで書いた方がわかりやすい。

let dataFilepath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("items.plist")

    func saveItems() {
        let encoder = PropertyListEncoder()
        do {
            let data = try! encoder.encode(itemsArray)
            try data.write(dataFilePath)
        } catch {
            print("encoding error")
        }
    }

    func retreveItems() {
        if let data = try? Data(contentsOf: dataFilepath!) {
            let decoder = PropertyListDecoder()
            do {
                try decoder.decode([Item].self, from: Data)
            } catch {
                print("decoding error")
            }
        } else {
            print("url is invalid")
        }
    }

まずは FileManager クラス。これはappのファイル操作をするためのクラス。このクラスのメソッドを使用することで、ファイルの作成・追加・移動・更新・削除などの基本的なCRUD操作が可能になる。defaultはUserdefaultsと同じでシングルトンのクラスなのでFileManagerとセットで考えて問題ない。まずはこのようにファイルの所在地を指定する。

次にデータの保存。データを保存するにはencodeしなければいけない。この時に保存するデータの方がカスタムの場合はEnodableプロトコルに準拠している必要がある。 データをエンコードできたらあとはそのデータを保存するメソッドである write メソッドを使用する。

次にデータの取得。まずはデータを格納しているパスを指定する。そしてそのパスからデータを取り出す。Data型で取り出す。そしてData型を再度カスタムな型のデータにデコードする。

メリット

Userdefaultsでは全てのデータが1つのPlistに保存されている。しかし、NSCoderによる保存ではファイルが保存されるパスをその任意に変更できる。そのため、1つのデータの塊の容量をコンパクトにすることができる。Userdefaultsの場合は使用する際に関係ないデータも全て含めて読み込む必要があるが、NSCoderを使用した場合は適切にファイルを分割することで読み込み時の無駄を排除することが可能になる。

デメリット

比較してみないとなんとも言えないが、おそらくUserdefaultsに対してのデメリットはほとんどないのでは?CoreDataや他のライブラリと比較すると色々デメリットが見えてくると思う。