您好我想知道如何在应用程序生命中只调用一次方法...我的应用程序应该从服务器下载一些文件,我只需要一次;我的意思是每次安装只需要一次
这是我的方法
//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");
}
答案 0 :(得分:6)
为什么不在本地存储中测试文件是否存在!
//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];
}
}
答案 1 :(得分:4)
您不能为方法执行此操作,但可以使用pthread_once
为函数执行此操作:
static pthread_once_t once = PTHREAD_ONCE_INIT;
pthread_once(& once, SomeFunction);
或者您可以使用dispatch_once
(当前实施的最自然选择)执行一次。
在某些情况下(不是这个),您可能也希望在+initialize
中完成工作。
编辑:问题已澄清
只需检查文件是否存在,或者如果您希望在多次启动时保留该文件,请使用首选项。
答案 2 :(得分:3)
将标志设置为NSUserDefaults密钥,并在downloadCovers方法中检查此NSUserDefault值。如果已经设置,则不执行任何操作,否则下载文件并将标志设置为true。
像这样:
-(void) downloadCovers {
BOOL downloaded = [[NSUserDefaults standardUserDefaults] boolForKey: @"downloaded"];
if (!downloaded) {
//download code here
[[NSUserDefaults standardUserDefaults] setBool:YES forKey: @"downloaded"];
}
}
干杯
答案 3 :(得分:0)
- (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");
}
}