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%.