に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)")
}
}
任意の助けが
あなたはおそらく正しいでしょう。 FRCなしのフェッチ要求を使用して終了し、うまくいきました。 – Minimi