Domanda

Sto creando un applicazione per iPhone piuttosto complesso con Core Data. Fino ad ora, le cose hanno lavorato bene. Come l'applicazione è stato sempre più complesso, tuttavia, un nuovo problema ha messo a punto: il primo controller della vista sta finendo il suo metodo viewDidLoad prima della AppDelegate diventa ancora a metà strada attraverso il suo metodo applicationDidFinishLaunching.

Il controller vista non è la radice, che è un controller scheda bar. Il VC in questione è quello per la scheda predefinita selezionata sulla barra delle schede. Si sta facendo istanziato da IB.

Non si è verificato prima che nella mia esperienza, ed è gettando via l'inizializzazione importante che sto facendo nelle AppDelegate (oggetti spostarsi da Core Data e preparandoli per l'uso). Inoltre, è intermittente - a volte il delegato ha traguardo per primo.

Qualcun altro ha notato una difficoltà come questo? Ogni codice di esempio che si occupa di una questione?

Credo che la risposta è quello di rendere il VC caricare i dati che l'AppDelegate si prepara solo quando l'AppDelegate invia un messaggio che è pronto. Sono un po 'preoccupato del fatto che questo è l'aggiunta di qualcosa che solo finire mi mordere nel culo più tardi.

È stato utile?

Soluzione

La soluzione che sto usando per evitare condizioni di gara come questa è quello di rinunciare completamente riferimento qualsiasi dell'interfaccia utente funzionale dell'applicazione fino a quando i dati sono stati caricati e convalidato. Nella parte superiore della mia -applicationDidFinishLaunching: metodo, faccio la seguente:

  1. Crea un'UIWindow con una visualizzazione secondaria:
    • un UIImageView di Default.png con una visualizzazione secondaria:
      • un UIActivityIndicatorView centrata nel telaio (e animazione)
  2. tasto Set finestra e visibile in modo che l'utente riceve un feedback visivo il più presto possibile che qualche scricchiolio dei dati è in corso prima del caricamento dell'interfaccia utente.
  3. Fare tutti i vostri dati di carico e convalida (che potrebbe includere attività di rete)
  4. Creare e aggiungere vista principale della interfaccia utente per la finestra come una visualizzazione secondaria proprio sotto la vista Default.png, che poi viene visualizzato e rimosso dal suo superview.

Come si implementa il punto 4 (richiamo del sottoprogramma, notifica asincrona, valore-chiave di osservazione, ecc ...) è interamente a voi. Quello che è importante è l'idea di fare il caricamento di qualsiasi componenti dell'interfaccia utente subordinato il caricamento di qualsiasi componente dati richiesti.

Questo consente di scrivere tutto il codice di interfaccia utente, senza preoccuparsi dei dati, che è quello che vuole fare in un'applicazione MVC in ogni caso.

Altri suggerimenti

Una volta che l'inizializzazione app delegato è terminata, licenziare un NSNotification - questa sarebbe l'ultima cosa che il metodo applicationDidFinishLaunching farà, presumibilmente.

Avere la stessa applicazione delegato ascoltare per la notifica e sparare un selettore, dire loadViewController, che poi carica il controller della vista.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top