私は私の解放のアプリから、次のクラッシュレポートを持っている:コアデータの同時実行 `performBlockAndWait:` NSManagedObjectContextゾンビ
synchronizeMyWords
方法は、最終的には、データベースからエンティティをフェッチメインのコンテキスト親とプライベートキュー・コンテキストを作成し、結果を保存します。すべての操作はバックグラウンドスレッドにあります。このメソッドは、アプリがbackground
とになるたびに呼び出されます。あなたは、私はコアデータ・スタックを管理するためにMagical Recordサードパーティのライブラリを使用していますご覧のよう
- (AWSTask *)synchronizeMyWords {
__weak typeof(self) weakSelf = self;
AWSContinuationBlock block = ^id _Nullable(AWSTask * _Nonnull task) {
if ([task.result isKindOfClass:[NSArray class]]) {
NSArray * records = (NSArray *)task.result;
NSManagedObjectContext * context = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
[context performBlockAndWait:^{
for (NSDictionary * info in records) {
[RDRWord MR_createEntityInContext:context];
}
[context save:nil];
}];
return [AWSTask taskWithResult:@YES];
}
return [AWSTask taskWithError:[NSError errorWithDomain:@"" code:404 userInfo:nil]];
};
AWSExecutor * executor = [AWSExecutor defaultExecutor];
return [[self loadLocalWords] continueWithExecutor:executor withBlock:block];
}
:ここでは簡略化された方法です。
+ (NSManagedObjectContext *) MR_contextWithParent:(NSManagedObjectContext *)parentContext
{
NSManagedObjectContext *context = [self MR_newPrivateQueueContext];
[context setParentContext:parentContext];
[context MR_obtainPermanentIDsBeforeSaving];
return context;
}
あなたはgithubのhereに全体NSManagedObjectContext+MagicalRecord
カテゴリを確認することができます。ここではプライベートキュー・コンテキストを作成する方法です。
context
のオブジェクトは、performBlockAndWait:
のオブジェクトがスコープをエスケープする前に解放されていますか? 私は個人的にクラッシュを再現できませんが、多くのユーザー(iOS 8.1-10デバイス)がこの問題の影響を受けています。
UPDATE 1:
ここでは、インスタンス同じレポートですblog
正しいメインコンテキストは保存されません。アプリがバックグラウンドになると主なコンテキストが保存されます。それは別の操作です。 'continueWithExecutor:block:'は、 'continuationBlock'がバックグラウンドスレッドで実行されることを意味します。ここでのタスクはリンクの簡単な説明を介して[BFTask](https://github.com/BoltsFramework/Bolts-ObjC)サブクラスです。 –