リリースしたアプリから次のクラッシュ レポートがあります。
synchronizeMyWords
メソッドはデータベースからエンティティをフェッチし、メイン コンテキストの親でプライベート キュー コンテキストを作成し、最後に結果を保存します。すべての操作はバックグラウンド スレッドで行われます。background
このメソッドは、アプリがおよびに入るたびに呼び出されforeground
ます。簡単な方法を次に示します。
- (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];
}
ご覧のとおり、Core Data スタックを管理するためにMagical Recordサードパーティ ライブラリを使用しています。プライベート キュー コンテキストを作成する方法を次に示します。
+ (NSManagedObjectContext *) MR_contextWithParent:(NSManagedObjectContext *)parentContext
{
NSManagedObjectContext *context = [self MR_newPrivateQueueContext];
[context setParentContext:parentContext];
[context MR_obtainPermanentIDsBeforeSaving];
return context;
}
ここNSManagedObjectContext+MagicalRecord
で githubのカテゴリ全体を確認できます。
context
内部のオブジェクトperformBlockAndWait:
がスコープをエスケープする前に解放されるのはどのように利用できますか? 個人的にクラッシュを再現することはできませんが、多くのユーザー (iOS 8.1 - 10 デバイス) がこの問題の影響を受けています。
更新 1:
これは、たとえばブログの同じレポートです