Simultaneidade dos dados principais `performBlockAndWait:` NSManagedObjectContext zombie
Eu tenho um seguinte relatório de falha do meu aplicativo lançado:
synchronizeMyWords
O método busca as entidades do banco de dados, cria o contexto da fila privada com o pai do contexto principal e, finalmente, salva os resultados. Todas as operações estão no encadeamento em segundo plano. Esse método é chamado toda vez que o aplicativo entra embackground
eforeground
. Aqui está um método simplificado:
- (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];
}
Como você vê, eu estou usandoRegistro Mágico Biblioteca de terceiros para gerenciar a pilha de dados principais. Aqui está um método de criação de contexto de fila privada:
+ (NSManagedObjectContext *) MR_contextWithParent:(NSManagedObjectContext *)parentContext
{
NSManagedObjectContext *context = [self MR_newPrivateQueueContext];
[context setParentContext:parentContext];
[context MR_obtainPermanentIDsBeforeSaving];
return context;
}
Você pode verificar o todoNSManagedObjectContext+MagicalRecord
categoria no githubaqui.
Como está disponível quecontext
objeto dentroperformBlockAndWait:
lançado antes de escapar do escopo? Pessoalmente, não consigo reproduzir a falha, mas muitos dos meus usuários (dispositivos iOS 8.1-10) são afetados por esse problema.
ATUALIZAÇÃO 1:
Aqui está, por exemplo, o mesmo relatório sobreblogue