2012-04-04 13 views
5

Ho un'applicazione iOS. L'applicazione ha 2 diverse viste: Principale e Impostazioni. In effetti, l'applicazione deve caricare e inizializzare alcune librerie e framework prima di essere utilizzata in Vista principale.Funzione iOS da chiamare una volta (quando l'applicazione è inizializzata)

Quando inserisco questa inizializzazione nel metodo viewDidLoad, funziona correttamente. Ma quando vai su Impostazioni e torna alla vista principale, l'inizializzazione ricomincia, che non è quello che voglio, ei risultati dell'applicazione in un problema di memoria.

Ho bisogno di un metodo che viene chiamato una volta all'avvio dell'applicazione. Qualche idea?

MODIFICA: Sono passato alla visualizzazione a schede. Carica una volta le viste. Questa è un'altra soluzione.

risposta

7

Utilizzare questo:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

Dovrebbe essere nella classe AppDelegate.

Speranza che aiuta

+0

Ma per la vostra applicazione di avvio rapido è necessario evitare di r Unning grandi thread all'interno di 'didFinishlaunchingWithOptions' – iDroid

+1

Sono d'accordo con @chiLLer. Ho bisogno di un metodo per chiamare all'interno di ViewController. – mert

+1

Intendevi il lancio iniziale delle tue applicazioni solo tu devi inizializzare le cose correttamente. se lo fai all'interno di 'viewDidLoad', ovviamente verrà richiamato ogni volta che lo carichi, qui tutto ciò che serve è ricordare se lo hai aperto alresdy o no. per questo è possibile mantenere plist o coppia di valori chiave NSUserDefault o anche una variabile globale in 'appDelegate' per ricordare lo stato .... – iDroid

28

stato in cui in uno dei tuoi commenti che non si desidera mettere questo codice in application:didFinishLaunching e volete tenerlo in viewDidLoad. È possibile utilizzare questo frammento per eseguire il codice solo la prima volta che si viene richiamato:

static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    // code here 
}); 

Il blocco interno verrà eseguita una sola volta. Se la vista viene caricata di nuovo, il blocco non viene richiamato. Si noti che non v'è un frammento di codice Xcode per questo che è possibile accedere iniziando a digitare dispatch_once nell'editor:

enter image description here

enter image description here

+0

Davvero ottimo per rispondere @ Mike Weller – iDroid

+0

Grazie per l'esempio thread-safe – Sergei

0

Nella tua AppDelegate, uno degli oggetti garantiti per avere un solo esempio (Singleton) in tutta l'applicazione, è possibile dichiarare una variabile di istanza/proprietà: BOOL initialized;

E poi nel viewDidLoad del vostro UIViewController, voi ch eck se è stato inizializzato il codice; se non, quindi eseguire il codice e impostare la variabile a true:

if (!initialized) { 
    // Code goes here 
    initialized = true; 
}