2015-07-13 11 views
5

Sto cercando di migrare del codice per utilizzare NSManagedObjectContext con NSPrivateQueueConcurrencyType.Creazione di com.apple.CoreData.ConcurrencyDebug 1 lavoro

A volte ricevo errori molto strani dopo aver salvato il contesto sul relativo genitore e quindi salvato il genitore. Mi chiedo se questi non debbano usare il contesto NSPrivateQueueConcurrencyType correttamente.

Ho attivato -com.apple.CoreData.ConcurrencyDebug 1 per tentare di eseguire il debug di questo. Sono abbastanza sicuro che questo non funziona comunque. Se eseguo operazioni sul contesto dell'oggetto gestito o ne cambio gli oggetti senza usare performBlock:, non ricevo un errore o un lancio.

Ecco come ho impostato gli argomenti dello schema: Schema Edit. Ho anche provato senza il leader -.

Qualche idea su cosa sto facendo male?

+1

La console registra 'CoreData: annotazione: asserzioni multi-threading di Core Data attivate. Al momento dell'avvio? – Bigood

+0

Mi raccomando questa lettura btw: http://oleb.net/blog/2014/06/core-data-concurrency-debugging/ – Bigood

+0

@Bigood Non vedo che se cerco nel log della console con il '- 'là, o non là. Domanda stupida: funziona con il simulatore? – Benjohn

risposta

5

L'argomento -com.apple.CoreData.ConcurrencyDebug è disponibile da iOS> 8 e OSX> 10.10: assicurati di indirizzare la piattaforma giusta.

La console dovrebbe registrare questo se è attivato il flag:

CoreData: annotation: Core Data multi-threading assertions enabled.

Fonte: Core Data Concurrency Debugging da Ole Begemann

+0

:-) Grazie per aver risposto ai tuoi commenti - stavo per chiedere se ti dispiacerebbe se lo avessi fatto. – Benjohn

+2

Per iOS10/macOS 10.12, è inoltre necessario specificare "-com.apple.CoreData.Logging.stderr 1" per vedere gli asserzioni nella console di debug. Vedere la sezione "Modifiche comportamentali" in: https://developer.apple.com/library/content/releasenotes/General/WhatNewCoreData2016/ReleaseNotes.html – Yohst

2

Lavorare con XCode 8.xe 10.x iOS, ho voluto fornire una risposta semplificata per chiunque voglia implementarlo ora.

È necessario prima di modificare lo schema per la tua app:

enter image description here

Una volta selezionata Scheme, selezionare Modifica schema che dovrebbe apparire nella parte inferiore del tuo elenco: enter image description here

Quando aperto, assicurati di avere selezionato Esegui e scegli Argomenti. Si vuole copiare i seguenti valori:

  • -com.apple.CoreData.ConcurrencyDebug 1
  • -com.apple.CoreData.Logging.stderr 1

Lo schermo dovrebbe essere simile a questo: enter image description here

Dopo aver lanciato l'applicazione, si dovrebbe vedere questo appaiono nella tua console ora quando queste opzioni sono abilitate:

CoreData: annotazione: asserzioni multi-threading di Core Data abilitate.

E quando si esegue in un'eccezione generata da questo, è probabile vedere questo:

CoreData` + [NSManagedObjectContext Multithreading_Violation_AllThatIsLeftToUsIsHonor]:

è possibile tornare alla l'editor di schemi e disabilitare questa registrazione secondo necessità per prevenire eccezioni in futuro.

Problemi correlati