2012-04-01 15 views
0

Hallo Ich fragte mich, wie kann ich eine Methode nur einmal in der Anwendungsdauer aufrufen ... Meine Anwendung sollte einige Dateien vom Server herunterladen und ich muss es nur einmal tun; Ich meine nur einmal pro Installation bedeuteniOS: Rufen Sie eine Methode nur einmal

hier ist meine Methode

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

} 

und diese Methode Set Bilder als 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

Sie meinen, nur ein einziges Mal _per installation_? Oder pro Lauf der App? –

+0

Ich bin verwirrt von der Frage. Wenn Sie eine Methode nur einmal aufrufen möchten, rufen Sie sie einmal auf! [self methodName]; –

+0

'#ifndef etwas // hier ist der Code; # endif' – 0xDE4E15B

Antwort

3

Setzen Sie ein Flag als NSUserDefaults-Schlüssel, und prüfen Sie in der downloadCovers-Methode, ob dieser NSUserDefault-Wert vorhanden ist. Wenn es bereits festgelegt ist, tun Sie nichts, laden Sie Dateien herunter und setzen Sie das Flag auf true.

Wie so:

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

Prost

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

Sie es nicht für ein tun können Methode, aber Sie können es für eine Funktion mit pthread_once tun:

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

oder Sie können einen Block einmal mit dispatch_once ausführen (die natürlichste Wahl für Ihre aktuelle Implementierung).

In einigen Fällen (nicht in diesem) möchten Sie vielleicht auch Ihre Arbeit in +initialize erledigen.

EDIT: Frage wurde geklärt

nur für die Existenz der Datei überprüfen, oder eine Präferenz, wenn Sie diese über mehrere Starts bestehen bleiben soll.

6

warum nicht nur testen, ob die Datei existiert oder nicht im lokalen Speicher!

+0

Dies. Sie möchten dies nicht auf einem Benutzerstandard oder einem anderen Mechanismus basieren. Wenn die Datei existiert, verwenden Sie sie. Wenn nicht, [erneut] herunterladen. Beachten Sie, dass es zu einem Zeitpunkt fast garantiert ist, dass Sie eine "Refresh" -Funktion wünschen und diese einfach zu halten. – bbum

Verwandte Themen