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

将一个标志设置为一个NSUserDefaults键,并检查downloadCovers方法中的NSUserDefault值。 如果已经设置,则什么都不做,否则下载文件并将标志设置为true。

像这样:

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

干杯

为什么不只是testing文件是否存在或不在本地存储!

 //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执行一个块(当前实现的最自然的select)。

在某些情况下(不是这个),你也可以select在+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"); } }