iOS: вызов метода всего один раз

Привет, мне было интересно, как я могу вызвать метод только один раз в жизни приложения … Мое приложение должно загрузить некоторые файлы с сервера, и мне нужно сделать это только один раз; Я имею в виду только один раз за установку

вот мой метод

//Download some images from server and save it into directory - (void) downloadCovers { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; [self saveFile:@"mag1" ofType:@"png" fromURL:@"http://myweb.com/mag1.png" inDirectory:documentsDirectory]; } 

и этот метод устанавливает изображения как UIButton BG:

  - (void)buttonsBGImage { UIImage * bgMag1 = [self loadImage:@"mag1" ofType:@"png" inDirectory:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]]; [mag1 setBackgroundImage:bgMag1 forState:UIControlStateNormal]; NSLog(@"BG IS SET"); } 

4 Solutions collect form web for “iOS: вызов метода всего один раз”

Установите флаг как ключ NSUserDefaults и проверьте это значение NSUserDefault в методе downloadCovers. Если он уже установлен, ничего не делать, иначе загрузите файлы и установите флаг в true.

Вот так:

 -(void) downloadCovers { BOOL downloaded = [[NSUserDefaults standardUserDefaults] boolForKey: @"downloaded"]; if (!downloaded) { //download code here [[NSUserDefaults standardUserDefaults] setBool:YES forKey: @"downloaded"]; } } 

ура

почему бы просто не проверить, существует ли файл или нет в локальном хранилище!

 //Download some images from server and save it into directory - (void) downloadCovers { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *pathToImg = [NSString stringWithFormat:@"%@/mag1.png",documentsDirectory]; BOOL isExist = [[NSFileManager defaultManager]fileExistsAtPath:pathToImg]; if (!isExist) { [self saveFile:@"mag1" ofType:@"png" fromURL:@"http://myweb.com/mag1.png" inDirectory:documentsDirectory]; } } 

Вы не можете сделать это для метода, но вы можете сделать это для функции, использующей pthread_once :

 static pthread_once_t once = PTHREAD_ONCE_INIT; pthread_once(& once, SomeFunction); 

или вы можете выполнить блок один раз с помощью dispatch_once (самый естественный выбор для вашей текущей реализации).

В некоторых случаях (а не в этом) вы также можете делать свою работу в +initialize .

РЕДАКТИРОВАТЬ: Вопрос уточнен

Просто проверьте наличие файла или используйте предпочтение, если вы хотите, чтобы это сохранялось в нескольких запусках.

  - (void)buttonsBGImage { if (!mag1.backgroundImage){ UIImage * bgMag1 = [self loadImage:@"mag1" ofType:@"png" inDirectory:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]]; [mag1 setBackgroundImage:bgMag1 forState:UIControlStateNormal]; NSLog(@"BG IS SET"); } } 
  • Могу ли я архивировать сертификат разработчика, а затем повторно подписывать его во время отправки с сертификатом распространения?
  • Повторяющийся self performSelector
  • Разница между очисткой и удалением папки DerivedData
  • Airplay Mirroring (от iPhone до Mac), как отражение или AirServer
  • Как обновить профиль подготовки для Push Notification - IOS
  • Новые журналы сбоев не отображаются в организаторе для одного конкретного устройства iOS
  • Почему Xcode 4 не выдает предупреждение о моей неполной реализации протокола UITableViewDataSource?
  • iOS 8 сбой в странном шаблоне
  • Динамическая высота UITableViewCell
  • iOS Перейти к другому виду
  • Приложение не выполняется в Xcode после успешной сборки
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.