2012-04-01 5 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

당신은 installation_ _per 한 평균 시간 :과 같이

? 또는 앱 실행 당? –

+0

질문에 혼란 스럽습니다. 메소드를 한 번만 호출하려면 한 번 호출하십시오! [self methodName]; –

+0

'#ifndef something // 여기 코드가 있습니다; # endif' – 0xDE4E15B

답변

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

이것은. 사용자 기본 또는 다른 메커니즘을 기반으로하고 싶지는 않습니다. 파일이 있으면 사용하십시오. 그렇지 않으면 [다시] 다운로드하십시오. 어떤 시점에서 "새로 고침"기능을 원한다는 것을 거의 확실하게 보장하고 죽은 사람을 간단하게 유지하면 더 쉽게 사용할 수 있습니다. – bbum

관련 문제