Ho scritto un'enorme app per iPad 2 anni fa e ora sto tornando ad aggiornarlo su iOS5. È un po 'disordinato perché è stata la mia prima grande app per iPad.suggerimenti per rintracciare un'interfaccia utente iOS a congelamento intermittente
Ha un passaggio di "sincronizzazione" che può durare per diversi minuti e si tratta di un gruppo di chiamate di metodi asincroni che vanno a prendere JSON da un URL e inserirli nei dati principali. Abbastanza spesso, l'app si blocca (l'interfaccia utente non risponde).
Quali sono alcune buone tecniche per rintracciare questo congelamento? Il debugger non è così utile, a meno che il codice non sia in esecuzione sul thread principale, non ci sia traccia di stack utilizzabile. L'app spesso non recupera né suggerisce una sorta di situazione di blocco morto.
Ecco un esempio particolare che potrebbe aiutare:
mi fermai l'esecuzione una volta ho verificato che è stato congelato. Sembra congelarsi sulla stessa linea ogni volta - un compito semplice. Che cosa sta succedendo qui? È così frustrante.
Questo accesso ai dati di base sta causando questo? Qualsiasi suggerimento sarebbe molto apprezzato.
EDIT 29-Giugno-2012
Click here per vedere la fonte della classe che fa tutto il/Aggiornamento/Eliminazione Creazione di oggetti dati fondamentali. Ho solo bisogno di fermare il blocco/crash in questa app. So che è un casino, mi fa anche rabbrividire. Ho scritto questo 2 anni fa con pochissima conoscenza dell'obiettivo-c. Dovrei riscriverlo, ma devo farlo funzionare e uscire dalla mia testa in 2 giorni. Qualcuno potrebbe darmi dei suggerimenti sugli approcci per ottenere questo thread sicuro al più presto? Potrei avvolgere ogni metodo che aggiorna NSManagedObjectContext nel grande codice del blocco di invio centrale?
Quando l'interfaccia utente non risponde è perché si sta eseguendo il codice sul thread principale che deve essere eseguito in background. Puoi provare a mettere in pausa l'app durante questo congelamento e, si spera, ottenere un'utile traccia di stack sul thread principale ... ma probabilmente non lo farai. L'unico modo che ho trovato davvero utile in questo scenario è l'essere davvero critico sul codice che stai eseguendo e dove. Verifica tutte le richieste Web e il codice relativo alla sincronizzazione e in qualsiasi altro luogo riteniate possa richiedere un processo intensivo. – Matt
Un'altra idea (piuttosto che mettere in pausa il debugger e sperare per il meglio) potrebbe essere quella di eseguire l'app in Strumenti, che ti dirà quali metodi stanno usando più a lungo. Ho trovato molto utile per il debug di questi problemi. –
Ho aggiornato la domanda con il link all'origine - se questo aiuta. –