ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

Swift × iOS SDKでTodoアプリを作る(タスクを配列で管理する)

f:id:mbaasdevrel:20180806093819p:plain

前回はタスクを todoClass というところに保存し、ACLで表示制限を行いました。この方法で問題ないのですが、データがタスクの数だけ増えてしまいますし、ネットワークの通信量も増えがちです。

タスクに対して細かいメタ情報を残すというのでなければ、タスクを配列で管理するのがmBaaSらしい(NoSQL型らしい)データ管理法と言えるでしょう。

そこで今回はユーザ情報にタスクを結びつける方法を紹介します。

保存時の処理

タスクを追加する処理を以下のように変更します。ログインユーザ(匿名認証でも可)を取得し、その addObjects メソッドを使います。これは配列で管理されているカラムに対して使うメソッドで、入力したタスク名 TodoTextField.text! を追加します。 todos カラムは最初はなくても大丈夫です。

@IBAction func TodoAddButton(_ sender: Any) {
  let user = NCMBUser.current()
  user?.addObjects(from: [TodoTextField.text!], forKey: "todos")
  user?.saveInBackground({(err) in
    if err != nil {
    } else {
      self.performSegue(withIdentifier: "toList", sender: nil)
    }
  })        
}

データ表示時の処理

タスクを表示する際には、データを改めて取得する必要はありません。ログインユーザにすでに紐付いていますので、それをテーブルビューに表示するだけです。

注意点としては user.object で取り出した情報はAnyになりますので、nilかどうかによって型を変換する必要があります。

@IBOutlet weak var todosView: UITableView!
var todos = [String]()
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let TodoCell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "todoCell", for: indexPath)
  let user = NCMBUser.current()
  TodoCell.textLabel!.text = self.todos[indexPath.row]
  return TodoCell
}

override func viewDidLoad() {
  super.viewDidLoad()
  let user = NCMBUser.current()
  self.todos = user?.object(forKey: "todos") != nil ? user?.object(forKey: "todos") as! Array : []
  self.todosView?.reloadData()
}

まとめ

ユーザ情報に結びつけることで、ACLの操作であったり、データ数の増加を抑えられるようになります。ただし、タスクを必要としていない場合でもデータを受信してしまう、更新や削除が多少面倒といった側面もあります。必要におうじて使い分けてください。

この実装はgoofmint/NCMB-Swift-iOS-Todo at v2にて公開しています。実装時の参考にしてください。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。