2017-03-22 12 views
0

もちろん、インターネット全体で検索しました。 しかし、この問題は解決できません。楽観的なロック失敗iOS swift

私は2つのエンティティを得ました: 投稿& PopularPost。 (互いにほぼ重複しています)

私が投稿を取得し、それがnumberoflikes、numberofcommentsのようなプロパティを更新すると良いです。 「PopularPosts」:

しかし、私はPopularPostをフェッチし、それがプロパティです更新しようと、それは 「楽観的ロックの失敗」フェッチと更新とエンティティを保存する

MYコードを言います。

let postpopFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "PopularPosts") 
     postpopFetch.predicate = NSPredicate(format: "id = %@", postId) 
     let resultp = try? CoreDataManager.sharedInstance.managedObjectContext.fetch(postpopFetch) 
     let resultDatap = resultp as! [PopularPosts] 

     for object in resultDatap { 

      print(object.numberOfHearts) 

      if like { 
       object.numberOfHearts = object.numberOfHearts + 1 
       object.isLiked = true 
      }else{ 
       (object.numberOfHearts > 0) ? (object.numberOfHearts = object.numberOfHearts - 1) : (object.numberOfHearts = 0) 
       object.isLiked = false 
      } 
     } 

     do { 
      try CoreDataManager.sharedInstance.managedObjectContext.save() 
      print("saved!") 
     } catch let error as NSError { 
      print("Could not save \(error), \(error.userInfo)") 
     } 
+0

コアデータスタックはどのように見えますか?いくつのコンテキストがありますか?親子関係がありますか? NSPersistent Containerを使用していますか? –

+0

シングルトンクラスでは1つのコンテキストしか保持されません。 親子関係はありません。 単純な2つのエンティティのみ。 – user3804063

+0

あなたは常にメインスレッドで読み書きしていますか? –

答えて

0

通常、オプティミスティックロックの失敗は、同じデータを変更しようとする2つの異なる管理対象オブジェクトのコンテキストによって引き起こされます。私はあなたが同時に別のスレッドから不適切にアクセスしている場合でも、1つのコンテキストでもこの問題を抱えることができると思います。 ManagedObjectContextsはではなく、 スレッドセーフではありません。です。

間違ったスレッドからmanagedObjectContextへのアクセスがあり、何も間違っていないコード行でクラッシュすることがあります。メインスレッドにないコアデータへのアクセスについて、コードを慎重に検索することをお勧めします。 [NSThread isMainThread]を使用して、デバッグのメインスレッドにないかどうかを確認します。

+0

管理対象オブジェクトコンテキストが1つしかありません と コアデータへのアクセスがメインスレッドから行われていることを確認しました。 でも、私はまだ同じ問題を抱えています。 オプティミスティックロックに失敗しました。 どうしてですか? – user3804063

関連する問題