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");

    }
 Josh Caswell01 апр. 2012 г., 23:04
Вы имеете в виду только один разза установку? Или за прогон приложения?
 Jack01 апр. 2012 г., 23:04
Я смущен вопросом. Если вы хотите вызвать метод только один раз, то вызовите его один раз! [self methodName];
 Mc.Lover01 апр. 2012 г., 23:16
только один раз за установку ... @JackHumphries
 0xDE4E15B01 апр. 2012 г., 23:06
#ifndef something //here's the code; #endif

Ответы на вопрос(4)

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

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

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

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

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

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

существует ли файл или нет в локальном хранилище!

//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];
    }

}
 bbum01 апр. 2012 г., 23:46
Этот. Вы не хотите основывать это на пользовательском стандартном или другом механизме. Если файл существует, используйте его. Если нет, [повторно] скачать. Обратите внимание, что в какой-то момент почти гарантировано, что вам понадобится функция «обновить», а простое сохранение этого сделает это проще.
 - (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");
        }

    }
Решение Вопроса

rDefault в вашем методе downloadCovers. Если он уже установлен, ничего не делайте, иначе загрузите файлы и установите флаг в true

Вот так:

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

ура

Ваш ответ на вопрос