Функция iOS вызывается один раз (при инициализации приложения)

У меня есть приложение для iOS. Приложение имеет 2 вида: Основной и Настройки. На самом деле приложению необходимо загрузить и инициализировать некоторую библиотеку и фреймворк, прежде чем оно будет использоваться в основном представлении.

Когда я помещаю эту инициализацию в метод viewDidLoad, она работает нормально. Но когда захожу в «Настройки» и возвращаюсь в «Основной вид», снова начинается инициализация, чего я не хочу, и приложение приводит к проблеме с памятью.

Мне нужен метод, который вызывается один раз при запуске приложения. Есть идеи?

РЕДАКТИРОВАТЬ: я переключился на представление с вкладками. Он загружает просмотры один раз. Это еще одно решение.


person mert    schedule 04.04.2012    source источник


Ответы (4)


Используйте этот:

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

Он должен быть в вашем классе appdelegate.

Надеюсь, поможет

person Novarg    schedule 04.04.2012
comment
Но для быстрого запуска вашего приложения вы должны избегать запуска больших потоков внутри didFinishlaunchingWithOptions - person iDroid; 04.04.2012
comment
Я согласен с @chiLLer. Мне нужен метод для вызова внутри ViewController. - person mert; 04.04.2012
comment
Вы имели в виду первоначальный запуск ваших приложений, только вам нужно правильно инициализировать все. если вы сделаете это внутри viewDidLoad, очевидно, он будет вызываться каждый раз, когда вы его загружаете. Здесь все, что вам нужно, это помнить, открывали ли вы его уже или нет. для этого вы можете поддерживать plist или пару значений ключа NSUserDefault или даже глобальную переменную в appDelegate, чтобы запомнить состояние.... - person iDroid; 04.04.2012
comment
Установите флаг в своем делегате приложения в том месте, о котором говорит @Novarg, и сбросьте его в viewDidXXXX вашего контроллера представления, предварительно проверив флаг. - person anticyclope; 04.04.2012

Вы заявляете в одном из своих комментариев, что не хотите помещать этот код в application:didFinishLaunching и хотите сохранить его в viewDidLoad. Вы можете использовать этот фрагмент для запуска кода только при первом вызове:

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

Внутренний блок будет выполнен только один раз. Если представление загружается снова, блок не вызывается. Обратите внимание, что для этого есть фрагмент кода Xcode, к которому вы можете получить доступ, начав вводить dispatch_once в редакторе:

введите здесь описание изображения

введите здесь описание изображения

person Mike Weller    schedule 04.04.2012
comment
Действительно отличный ответ @Mike Weller - person iDroid; 04.04.2012

Вы также можете использовать

+ [NSObject initialize]

Определите метод класса с таким именем, и он будет запущен один раз перед отправкой любых других сообщений этому классу:

+ (void)initialize {
  // Put one-time initialization code here.
}

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/clm/NSObject/initialize

person Tyler    schedule 06.06.2012

В вашем AppDelegate, одном из объектов, который гарантированно имеет только один экземпляр (singleton) во всем приложении, вы можете объявить переменную/свойство экземпляра: BOOL initialized;

И затем в viewDidLoad вашего UIViewController вы проверяете, был ли инициализирован его код; если нет, то запустите код и установите для переменной значение true:

 if (!initialized) {
    // Code goes here
    initialized = true;
 }
person Roy    schedule 04.04.2012