2017-05-30 14 views
0

にperformBlockにフェッチ実行: [NSManagedObjectContext Multithreading_Violation_AllThatIsLeftToUsIsHonor]()Core Dataは、バックグラウンドスレッド

バックグラウンドスレッドで

は、私が確認したいですオブジェクトが存在する場合は更新します。それが私にそれを挿入し、更新しなければ。何らかの理由で、フェッチを実行しようとしたときにxcodeが並行性の違反を起こしていると言っています。バックグラウンドでフェッチを実行することはできませんか?

これは私のコンテキストのための私の設定です:

Persistent store -> Root saving context -> default context (concurrency type main) persistent store -> Root saving context -> background context (concurrency type private)

バックグラウンド・コンテキストがperformBlockしようとしている:

NSManagedObjectContext *backgroundContext = [NSManagedObjectContext MR_context]; 
    [backgroundContext performBlock:^{ 
     [Conversation parseConversationAndCalls:objects inContext:backgroundContext]; 

     ... 
    }]; 

その後、parseConversationAndCallsメソッド呼び出しがフェッチを実行します:

+ (void) parseConversationAndCalls:(NSArray*)objects inContext:(NSManagedObjectContext*)localContext { 
    ... 
    for (NSArray *callData in conversationsCallData) { 

     NSNumber *callID = [BPDObject scrubbedInteger:callData[1]]; 
     Call *call = (Call*) [FetchRequestHelper fetchWithClass:Call.self withID:callID inContext:localContext]; // breakpoint hit here 

     if (call == nil) { 
      call = [Call insertInManagedObjectContext:localContext]; 
     } 

     [call updateWithValues:callData inContext:localContext]; 
     call.contact = contact; 
    } 
} 

fetchrequest helpeフェッチ要求、FRCを作成Rだけ、次いでperformBlockチャンクでフェッチ実行する:UIを更新するために使用されているので

... //here context is the same as backgroundContext and frc is the fetched results controller 
    context.performAndWait { 
     do { 
      try frc.performFetch() 
     } catch { 
      fatalError("Failed to perform fetch from FetchedResultsController: \(error)") 
     } 
    } 

任意の助けが

答えて

0

を理解されるであろう一般fetchedResultsControllerは、メインスレッド上で実行され。 fetchedResultsControllerが作成されると、managedObjectContextが与えられました。これは主なコンテキストだと強く疑われます。したがって、バックグラウンドコンテキストでtry frc.performFetch()を呼び出すと、バックグラウンドスレッドのメインスレッドコンテキストにアクセスしています。

これはあなたが共有したコードで確認できました。あなたが共有していない他の違反があるかもしれません。それらを追跡する幸運。

+0

あなたはおそらく正しいでしょう。 FRCなしのフェッチ要求を使用して終了し、うまくいきました。 – Minimi

関連する問題