Параллелизм базовых данных `executeBlockAndWait:` NSManagedObjectContext zombie
У меня есть следующий отчет о сбое из моего выпущенного приложения:
synchronizeMyWords
Метод выбирает объекты из базы данных, создает частный контекст очереди с основным контекстом parent и, наконец, сохраняет результаты. Все операции находятся в фоновом потоке. Этот метод вызывается каждый раз, когда приложение входит в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. Вот метод создания частного контекста очереди:
+ (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:
Вот например тот же отчётблог