前回はタスクを 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にて公開しています。実装時の参考にしてください。