iOS:只调用一次方法

时间:2012-04-01 21:02:35

标签: iphone objective-c ios xcode cocoa-touch

您好我想知道如何在应用程序生命中只调用一次方法...我的应用程序应该从服务器下载一些文件,我只需要一次;我的意思是每次安装只需要一次

这是我的方法

//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 个答案:

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

    }