Aggiornamento 2: Ho trovato una soluzione alternativa per sincronizzare MOC deallocating e saving. Si prega di consultare il progetto aggiornato. https://github.com/shuningzhou/MOCDeadLock.gitApplication sticks on OSSpinLockLockSlow
Nota: l'ho fatto fallire in modo più aggressivo. Non eseguirlo su un dispositivo reale!
Aggiornamento: Un progetto di esempio per dimostrare questo problema. https://github.com/shuningzhou/MOCDeadLock.git
XCode 6.2: impossibile riprodurre.
XCode 6.3: Riproducibile.
XCode 6.4 beta: Riproducibile.
========================== Il problema ================ ===============
Dopo l'aggiornamento a XCode 6.3, la nostra app è stata bloccata in modo casuale su OSSpinLockLockSlow
. Nel nostro progetto, abbiamo utilizzato NSOperation
e NSOperationQueue
per recuperare i dati dal nostro server e utilizzato i dati principali per la persistenza dei dati.
Questo problema non è mai accaduto prima! È possibile vedere dallo stack trace che nessuna chiamata viene effettuata dal nostro codice. Non sono sicuro da dove iniziare il debug di questo. Qualcuno potrebbe fornire una guida?
Grazie in anticipo!
prega di consultare la traccia dello stack
Edit:
Stiamo usando AFNetworking
e la nostra NSOperations
sono sottoclassi di AFHTTPRequestOperation
. Abbiamo aggiunto alcune proprietà personalizzate e sovrascritto il metodo -(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];
}
Per Core Data
, stiamo seguendo il modello thread-confinement
. Abbiamo separato managed object context
per ogni thread e i contesti condividono un valore statico persistent store coordinator
.
Edit 2:
Maggiori informazioni: ho trovato che questo problema si verifica quando il sistema esce più thread contemporaneamente. Archiviamo il contesto oggetto gestito nel dizionario del thread e vengono rilasciati all'uscita dai thread.
[[[NSThread currentThread] threadDictionary] setObject:dataManager forKey:@"IHDataManager"];
L'utilizzo della CPU è di circa il 20%.
Si prega di pubblicare il codice relativo a 'NSOperation'. – SevenBits
Avete un gestore di segnale nel vostro sistema, in particolare un gestore di crash? Dai un'occhiata ai tuoi thread per qualsiasi riferimento a '_sigtramp'. (Nota che puoi copiare tracce di stack con Cmd-C, non devi fare screenshot.) Suppongo che l'utilizzo della CPU diventi molto alto (forse accende i fan)? –
@SevenBits si prega di vedere la domanda modificata –