iOS SDKで操作をしている際に Operation is invalid after previous operation. というエラーが出ることがあります。パターンは幾つかあるのですが、筆者が出たのは会員管理でリレーションを使った場合です。
会員管理でリレーションを使う
会員管理を行う NCMBUser はNCMBObjectを継承しているので、NCMBObjectのメソッドはそのまま利用できます。リレーションも同様です。
// タスクを作成 let task = NCMBObject(className: "todoClass") task?.setObject(TodoTextField.text!, forKey: "task") task?.save(nil) // ユーザのリレーションに追加 let user = NCMBUser.current() let relation = user?.relationforKey("tasks") relation?.add(task) user?.save(nil) self.performSegue(withIdentifier: "toList", sender: nil)
このような操作を行った時に Operation is invalid after previous operation. が発生しました。
解決策
原因としては、現在のユーザ情報のデータ NCMBUser.current()
はローカルからのデータを復元して用いているので、リレーションデータが復元できていなかったためだったようです。
そこで、起動時に fetch
を実行するとエラーが出なくなりました。
let currentUser = NCMBUser.current() if currentUser != nil { currentUser?.fetch(nil) return true }
まとめ
Operation is invalid after previous operation. は幾つかの場所で発生するようなので一概にこの解決方法が使えないケースもあるかと思います。ちょうど役立つケースがあれば幸いです。