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

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

iOS SDKで "Operation is invalid after previous operation." が出る場合の対処法

f:id:mbaasdevrel:20180806093819p:plain

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. は幾つかの場所で発生するようなので一概にこの解決方法が使えないケースもあるかと思います。ちょうど役立つケースがあれば幸いです。

中津川 篤司

中津川 篤司

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