2013-03-19 11 views
5

Ich habe eine ViewController, die eine zufällige Shuffle auf einem Array durchführt und Text an ein Label (in der viewDidLoad-Methode) spuckt. Das Problem ist, dass wenn ich zum selben ViewController navigiere, es den Shuffle erneut durchführt und ich ihn nur jeden Tag neu mischen muss.Überprüfen, ob eine Ansicht seit Mitternacht geladen wurde

Also muss ich überprüfen, ob dieser ViewController am gleichen Tag (d. H. Seit Mitternacht) geladen wurde und ich kann dann die Shuffle in eine if-Anweisung setzen. Kann ich den Shuffle um Mitternacht planen, unabhängig davon, ob die App geöffnet ist oder nicht?

Ich habe in die Einstellung eines Boolean zu NSUserDefaults: etwas wie hasLoadedSinceMidnight untersucht, aber dann kann nicht herausfinden, wie der Boolean um Mitternacht zurückgesetzt wird.

+0

Das wäre eine Möglichkeit, aber Sie müssten auch den Zustand der Elemente speichern, die Sie "mischen" und diese auch laden. –

+0

Die Array-Objekte stammen von CoreData, daher sind sie bereits gespeichert. Die Methode lädt sie einfach in ein Array und mischt sie in ein anderes Array. – RoshDamunki

Antwort

7

Sie könnten die significantTimeChange Methode des AppDelegate implementieren:

-(void)applicationSignificantTimeChange:(UIApplication *)application { 
    //tell your view to shuffle 
} 

Diese Methode jede Mitternacht und während signifikanter Zeitänderungen wie zum Beispiel einer Zeitzonenänderung aufgerufen wird. Wenn Ihre App beim Empfang des Ereignisses geschlossen wird, wird diese Methode beim nächsten Öffnen der App aufgerufen.

Weitere Informationen hierzu finden here

Eine weitere Möglichkeit, die gleiche Sache innerhalb des Viewcontroller anstatt im AppDelegate hinzufügen würde tun sehen sein:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performAction) name:UIApplicationSignificantTimeChangeNotification object:nil]; 

und dann können Sie einfach Ihre ausführen Shuffle-Operation in der -(void)performAction; Methode dieses ViewControllers.

+1

+1, oder besser: subscribe für [UIApplicationSignificantTimeChangeNotification] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid)/TP40006728-CH3-SW44) im View-Controller – vikingosegundo

+0

Das stimmt. Ich füge das hinzu. – Jsdodgers

+0

+1 Viel besser als das, was ich vorgeschlagen habe! – rog

0

Anstatt BOOL zu speichern, können Sie Datum/Uhrzeit (NSDate) des letzten Shuffle speichern.

Dann überprüfen Sie, ob es Mitternacht seit dem letzten Mischen vergangen ist oder nicht, indem Sie das gespeicherte Datum und das aktuelle Datum in viewDidAppear vergleichen.

Siehe NSTime Dokumentation: http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html

Und NSDateFormatter Dokumentation: https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003643


UPDATE:

Wie gewünscht, hier einige Codebeispiele. Zugegebenermaßen gibt es sehr wohl bessere Lösungen dafür, aber ich glaube, dass dieses Code-Snippet Ihnen helfen wird, Ihr Problem zu überwinden. Überprüfen Sie, ob ein Datum mit NSUserDefaults gespeichert wurde, und vergleichen Sie es mit dem aktuellen Datum. Wenn die Daten nicht übereinstimmen, mischen Sie das Array und speichern Sie das aktuelle Datum (erneut unter Verwendung von NSUserDefaults). (Ich habe die Freiheit, unter der Annahme, genommen, dass die Zeit in der Tat nach vorne bewegen wird weiter, so dass es nicht überprüft, um sicherzustellen, dass lastSavedDate ist vor die currentDate.)

NSDate *currentDate = [[NSDate alloc] init]; 
NSDate *lastShuffleDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastShuffleDate"]; 

// check to see if there is a prior shuffle date 
// if there is not, shuffle the array and save the current date 
if (!lastShuffleDate) { 
    NSLog(@"No object set for 'lastShuffleDate'"); 

    //[self shuffleMyArray]; 

    [[NSUserDefaults standardUserDefaults] setObject:currentDate forKey:@"lastShuffleDate"]; 
    return; 
} 

// set up the date formatter 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
[dateFormatter setLocale:usLocale]; 
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 

NSLog(@"Current Date: %@", [dateFormatter stringFromDate:currentDate]); 
NSLog(@"Saved Date: %@", [dateFormatter stringFromDate:lastShuffleDate]); 

// check to see if the dates are the same by comparing the dates as a string 
if (![[dateFormatter stringFromDate:currentDate] isEqualToString:[dateFormatter stringFromDate:lastShuffleDate]]) { 
    NSLog(@"Dates are different...!"); 

    //[self shuffleMyArray]; 

} else { 
    NSLog(@"Dates are the same... (midnight has not passed)"); 
} 

// save the time of the last shuffle 
[[NSUserDefaults standardUserDefaults] setObject:currentDate forKey:@"lastShuffleDate"]; 

An diesem Punkt, Es gibt keinen wirklichen Grund für Sie, die Zeiten zu überprüfen, aber ich habe es aufgenommen, falls Sie neugierig waren.

// remote dateStyle and set timeStyle to check times 
[dateFormatter setDateStyle:NSDateFormatterNoStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 
NSLog(@"Current Time: %@", [dateFormatter stringFromDate:currentDate]); 
NSLog(@"Saved Time: %@", [dateFormatter stringFromDate:lastShuffleDate]); 
+0

Interessant - So erstellen Sie einen Zeitstempel, wenn die Ansicht lädt und speichern Sie die 'NSUserDefaults'? Oder führen Sie einfach eine Prüfmethode in der Ansicht aus? – RoshDamunki

+0

Wenn Sie mischen, speichern Sie die Zeit in NSUserDefaults. Überprüfen Sie in viewDidAppear (wahrscheinlich die bessere Option für Ihre Anforderungen) in NSUserDefaults die aktuelle Uhrzeit anhand der gespeicherten Zeit und bestimmen Sie, ob Mitternacht verstrichen ist oder nicht. Wenn dies der Fall ist, mischen Sie die NSUserDefaults neu und aktualisieren Sie sie mit der aktuellen Zeit, um den letzten Shuffle anzuzeigen. – rog

+0

können Sie mir einen Beispielcode geben. Ich habe versucht, das funktionieren zu lassen, aber ich kann es nicht scheinen. 'timeIntervalSinceNow' gibt die Zeit in Sekunden zwischen zwei Daten zurück. Wenn der Benutzer die App um 23:45 Uhr öffnet und dann um 00:01 Uhr sind nur 16 Minuten (960s) vergangen. Daher sind <86400s vergangen, aber es ist der nächste Tag. Würde ein Vergleich mit der 'NSDayCalendarUnit' beider Daten funktionieren? (wenn sie nicht == dann shuffle) – RoshDamunki

Verwandte Themen