うるおいらんど

アプリ開発やサイト制作のメモとか。

【Swift】NSData/NSFileWrapperを利用してデータを保存する

魚ライン
魚ライン

お久しぶりになってしまった。

CoreDataを用いてデータを保存しようとすること約5日。謎のエラーが出まくり上手くいかない。なんとか保存できるようになったがrelationshipがうまく付けられない。少しコードを変えれば別のところでエラー。原因も教えてくれずただただアプリが固まる。

 

なんてことを繰り返して結局CoreDataを使わずNSData/NSFileWrapperを使う方法で、ファイルの書き込み・読み出しに成功しました。

私を助けてくれたのはこの本。

 

UIKit&Swiftプログラミング 優れたiPhoneアプリ開発のための UI実装ガイド

新品価格
¥3,218から
(2015/12/15 21:58時点)

 

この本によれば、 NSData/NSFileWrapperを用いるのが標準方法と書いてあったんですが、調べてもあまりでてこない。CoreDataのことならいっぱいでてくるのに。

とにかくドキュメントの保存、読み出しの仕方だけざっくりと。
 

UIDocumentのサブクラスを作成する

 

File>New>FileよりiOSのCocoaTouchClassを選択>Subclass OfをUIDocumentにして作成

そこにこのようなコードを書いていきます。

 

今回は画像と文字と日付と画像の入った配列を保存・表示します。

loadFromContentsの中身を書いていきます。

 

続いてcontentsForTypeメソッドを書いていきます。

 

ここでひっかかったのが、NSMutableArrayの読み出しです。

本には書いてなかったので、dataのところに何を書けばいいのかがわからず結構迷ってしまいました。

結局

という書き方で成功。

 

Documentを使う側の実装

続いてデータを保存します。

 

ファイルがあればコンソールに表示。なければsubjectにお題を保存する。

これを2回実行すれば1回目は「Documentを保存しました。」と表示され、2回目は「お題」と表示されるはずです。

実際の私のコードでは、保存したい内容のところにわさわさ書いてあります。ファイルもお題ごとに作成してほしいので、filePathをこのようにしています。

実際はsubjectTitleは毎回異なる値が入ります。そうすることでsubjectTitleごとにファイルを作成してくれます。

 

読み出しだけを別に行う場合も同様に、ファイルがあれば読みこむ、なければコンソールにファイルがないと表示〜という風にしてください。

 

今回配列で保存した画像をコレクションビューに配置する、ということがしたかったんですがなかなかにはまってしまったのが、openWithCompletionHandlerメソッドです。

userDefaultsを使用してsubjectTitleの値だけ別に配列で保存して、そのファイルを1つずつ探してきて対応した画像を表示させる、ということをしたかったのですが、どうも上手くいかない。

 

こんな感じのコードを描いたのですが、openWithCompletionHandlerでは一番最後の画像しか入りません。subjectTitleを配列に入れていくとすれば[“パン”,”パン”,”パン”]になってしまう。

色々コンソールに表示させてみてみると、ファイルの存在チェックをした後、ファイルを開くまでに時間差があり、isFileExistsに入っているdocumentのファイルURLが全て一番最後のものになってしまっていました。

 

解決策としては配列を用意して、そこにdocumentを格納しておき、(ここではdocumentArrayに格納)

このif isFileExists とopenWithCompletionHandlerメソッドの間で取り出すことで、それぞれのファイルを取り出すことができました。

 

そしてこのopenWithCompletionHandlerメソッドより読み込んだ値をコレクションビューに表示させたいのに、先にコレクションビューのメソッドが呼ばれるので値が入れられない・・・となってしまったので値を入れた後にコレクションビューをreloadしておきます。

 

おそらく綺麗なコードではなさそうですが、動いたのでとりあえず良しとしています。。

 

なんとかiPhoneにもともと入っている写真アプリのような感じの仕組みが作れた気がします。

データが膨大になったら〜みたいなことは頭の片隅にはありますが、まだわからないので後々デバッガーになって頑張ります・・・。

 

感想

なんだ感想ってとか言わないで!とにかくいい感じに動くようになって思ったこと。

根気よく調べればなんとかなる。ということと自分で色々とコードをいじってみることもすごく大切だということ。結構なんでも調べれば出てくるけれど、今回は本当に出てこなくて困った。なんて調べればいいのかもよくわからなかったけれど、それこそXcodeではメソッド名が出てくるわけで、それを頼りになんとかしてみることも意外とできるなーってこと。

しかしCoreDataが結局使えなかったのがムムムといった感じ。また機会があれば。

 

あとSwiftだけじゃなくObjective-Cの記事も読んでみるのが大事だと思います。メソッド名は同じだったりするので結構ありがたい。一番問題なのはリファレンスが一番読めないということ(笑)もうちょっとわかりやすく書いて欲しい。みるところが悪いのかなぁ・・・・

 

とにかくもかくにも頑張ったよ!!!!!生きてるよ!!

ちなみにアプリ内のコードはもうちょい複雑でごちゃごちゃしてます。配列の中に配列入れちゃったりしてるよ。配列超便利。

 

とりあえず今日でこの部分を終わらせようと思います(まだ終わってない・・・)

ではでは

魚ライン
モッピー!お金がたまるポイントサイト
魚ライン

Swiftの記事一覧を見る

コメント

コメントは認証制です。詳しくは下記の注意をお読みください。

コメントを残す

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

魚ライン 魚ライン