2012-04-04 8 views
5

Ich habe eine iOS-Anwendung. Anwendung hat 2 verschiedene Ansichten: Main und Einstellungen. Tatsächlich muss die Anwendung einige Bibliotheken und Frameworks laden und initialisieren, bevor sie in der Hauptansicht verwendet werden.iOS-Funktion einmal aufgerufen werden (wenn die Anwendung initialisiert wird)

Wenn ich diese Initialisierung in viewDidLoad Methode setzen, funktioniert es OK. Wenn Sie jedoch zu Einstellungen wechseln und zur Hauptansicht zurückkehren, wird die Initialisierung erneut gestartet. Dies ist nicht das, was ich möchte, und die Anwendung führt zu einem Speicherproblem.

Ich brauche eine Methode, die einmal aufgerufen wird, wenn die Anwendung gestartet wird. Irgendeine Idee?

EDIT: Ich wechselte zu Registerkartenansicht. Es lädt Ansichten einmal. Dies ist eine andere Lösung.

Antwort

7

verwendet ein:

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

Es sollte in Ihrer AppDelegate Klasse sein.

Hoffe, dass es

+0

Aber für Ihre Anwendung vermeiden Sie müssen schnelle Inbetriebnahme r: sind zu dieser Klasse geschickt große Threads innerhalb der 'didFinishlaunchingWithOptions' – iDroid

+1

Ich stimme mit @chiLLer. Ich brauche eine Methode, um innerhalb von ViewController aufzurufen. – mert

+1

Sie meinten, Ihre Anwendungen starten nur, Sie müssen die Dinge richtig initialisieren. Wenn Sie es innerhalb der 'viewDidLoad' machen, wird es natürlich jedes Mal aufgerufen, wenn Sie es laden. Hier müssen Sie nur daran denken, ob Sie es bereits geöffnet haben oder nicht. Dazu können Sie das Schlüsselwertpaar plist oder NSUserDefault verwalten oder sogar eine globale Variable im 'appDelegate', um sich den Zustand zu merken .... – iDroid

28

Sie Zustand in einem Ihrer Kommentare hilft, die Sie nicht wollen, diesen Code in application:didFinishLaunching setzen und Sie wollen es in viewDidLoad zu halten. Sie können diese Schnipsel verwenden Sie den Code nur das erste Mal ausgeführt wird, aufgerufen wird:

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

Der innere Block wird nur einmal durchgeführt werden. Wenn die Ansicht erneut geladen wird, wird der Block nicht aufgerufen. Beachten Sie, dass es ein Xcode-Code-Snippet für diese, die Sie durch das Starten zugreifen können dispatch_once im Editor eingeben:

enter image description here

enter image description here

+0

Wirklich toll Antwort @Mike Weller – iDroid

+0

Vielen Dank für Thread-Safe-Beispiel – Sergei

0

In Ihrem AppDelegate, eines der Objekte garantiert nur eine Beispiel (Singleton) während der App können Sie eine Instanz Variable/Eigenschaft deklarieren: BOOL initialized;

Und dann in viewDidLoad Ihrer UIViewController, Sie ch eck wenn es der Code ist initialisiert worden; wenn nicht, dann den Code ausführen und die Variable auf true gesetzt:

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