Aplicativo fica no OSSpinLockLockSlow

Atualização 2: Encontrei uma solução alternativa que é sincronizar a desalocação e salvamento do MOC. Por favor, veja o projeto atualizado.https://github.com/shuningzhou/MOCDeadLock.git

Nota: Eu fiz isso falhar de forma mais agressiva. Não o execute em um dispositivo real!

Atualizar: Um projeto de amostra para demonstrar esse problema.https://github.com/shuningzhou/MOCDeadLock.git

XCode 6.2: Não foi possível reproduzir.

XCode 6.3: reproduzível.

XCode 6.4 beta: reproduzível.

==========================O problema ===============================

Nosso aplicativo travou aleatoriamenteOSSpinLockLockSlow após a atualização para o XCode 6.3. Em nosso projeto, usamosNSOperation eNSOperationQueue para buscar dados do nosso servidor e usou o Core Data para persistência de dados.

Esse problema nunca aconteceu antes! Você pode ver no rastreamento da pilha que nenhuma chamada é feita pelo nosso código. Não sei por onde começar a depurar isso. Alguém poderia fornecer alguma orientação?

Agradeço antecipadamente!

Por favor, veja o rastreamento da pilha

Editar:

Nós estamos usandoAFNetworking e nossoNSOperations são subclasses deAFHTTPRequestOperation. Adicionamos algumas propriedades personalizadas e substituímos o método-(void)start:

- (void)start;
{
    //unrelated code...

    NSString *completionQueueID = [NSString uuid];
    const char *cString = [completionQueueID cStringUsingEncoding:NSASCIIStringEncoding];
    self.completionQueue = dispatch_queue_create(cString, DISPATCH_QUEUE_SERIAL);

    //unrelated code....

    [super start];
}

ParaCore Data, Estamos seguindo othread-confinement padronizar. Temos separadomanaged object context para cada thread, e os contextos compartilham uma estáticapersistent store coordinator.

Edição 2:

Mais informações: Descobri que esse problema ocorre quando o sistema sai de vários threads ao mesmo tempo. Armazenamos o Contexto do Objeto Gerenciado no dicionário de threads e eles são liberados quando os threads saem.

[[[NSThread currentThread] threadDictionary] setObject:dataManager forKey:@"IHDataManager"];

O uso da CPU é de cerca de 20%.

questionAnswers(2)

yourAnswerToTheQuestion