2012-04-01 79 views
0

嗨我想知道如何在应用程序生命中只调用一次方法...我的应用程序应该从服务器下载一些文件,而且我只需要执行一次;我的意思是说只是一个每安装一次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"); 

    } 
+0

你的意思是一次_per installation_?或每次运行的应用程序? – 2012-04-01 21:04:14

+0

我对这个问题感到困惑。如果你只想调用一次方法,那就调用它一次! [self methodName]; – 2012-04-01 21:04:29

+0

'#ifndef something //这是代码; #endif' – 0xDE4E15B 2012-04-01 21:06:35

回答

3

将一个标志设置为NSUserDefaults键,并在downloadCovers方法中检查此NSUserDefault值。如果已设置,则不执行任何操作,否则下载文件并将标志设置为true。

像这样:

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

干杯

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

    } 
4

你不能为它做方法,但您可以使用pthread_once

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

或者您可以使用dispatch_once(当前实现的最自然的选择)执行一次块。

在某些情况下(不是这一个),您可能还倾向于在+initialize中完成您的工作。

编辑:问题是澄清

只是检查文件的存在,或者,如果你想这个在多个发射坚持使用偏好。

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

} 
+0

This。您不希望基于用户默认或其他机制。如果文件存在,请使用它。如果没有,请[重新]下载。请注意,在某些时候,几乎可以保证您需要一个“刷新”功能,并且保持这种简单的功能将使这一点变得更加简单。 – bbum 2012-04-01 21:46:27