2013-03-19 16 views
5

Ho un ViewController che esegue una riproduzione casuale casuale su una matrice e sputa il testo in un'etichetta (nel metodo viewDidLoad). Il problema è che ogni volta che navigo sullo stesso ViewController si esegue di nuovo lo shuffle e ho solo bisogno di rimescolarlo una volta ogni giorno.Controllare se una vista ha caricato da mezzanotte

Quindi ho bisogno di controllare se questo ViewController è stato caricato prima nello stesso giorno (ad esempio da mezzanotte) e posso quindi inserire lo shuffle in un'istruzione if. Posso programmare la riproduzione casuale a mezzanotte indipendentemente dall'app aperta?

Ho cercato di impostare un valore booleano su NSUserDefaults: qualcosa come hasLoadedSinceMidnight ma poi non riesco a capire come resettare il booleano a mezzanotte.

+0

Questo sarebbe un modo, ma avresti anche bisogno di salvare lo stato degli elementi che stai "mescolando" e caricare anche quelli. –

+0

Gli oggetti array provengono da CoreData in modo che siano già stati salvati. Il metodo li carica semplicemente in un array e li mescola in un altro array. – RoshDamunki

risposta

7

Si potrebbe implementare il metodo significantTimeChange del AppDelegate:

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

Questo metodo viene chiamato ogni mezzanotte e durante i cambi di tempo significativo, come un cambiamento di fuso orario. Se la tua app viene chiusa quando l'evento viene ricevuto, questo metodo verrà chiamato quando l'app verrà aperta successivamente.

Maggiori informazioni possono essere visualizzate here

Un altro modo per fare la stessa cosa dentro del vostro ViewController anziché nella AppDelegate sarebbe quello di aggiungere:

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

e quindi si può solo eseguire la tua shuffle nel metodo -(void)performAction; di quel ViewController.

+1

+1, o meglio: iscriversi a ['UIApplicationSignificantTimeChangeNotification'] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006728-CH3-SW44) nel controller vista – vikingosegundo

+0

Questo è vero. Lo aggiungerei. – Jsdodgers

+0

+1 Molto meglio di quello che ho suggerito! – rog

0

Invece di memorizzare un BOOL, è possibile memorizzare la data e l'ora (NSDate) dell'ultimo shuffle.

Quindi verificare se è passata o meno la mezzanotte dall'ultimo shuffle confrontando la data memorizzata e la data corrente nel viewDidAppear.

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

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


UPDATE:

Come richiesto, ecco alcuni esempi di codice. Certo, molto bene potrebbero essere soluzioni migliori a questo, ma credo che questo frammento di codice ti aiuterà a superare il tuo problema. Ciò che fa è controllare se c'è una data salvata usando NSUserDefaults, quindi confrontare con la data corrente. Se le date non corrispondono, mischiare l'array, quindi salvare la data corrente (utilizzando nuovamente NSUserDefaults). (Mi sono preso la libertà di fare l'ipotesi che il tempo sarà davvero continuare ad andare avanti, in modo che non controlla per assicurarsi che sia lastSavedDateprima il 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"]; 

A questo punto, non c'è una vera ragione per controllare gli orari, ma l'ho incluso nel caso fossi curioso.

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

Interessante - Quindi creare un timestamp quando la vista viene caricata e salvata in 'NSUserDefaults'? O semplicemente eseguire un metodo di controllo all'interno della visualizzazione? – RoshDamunki

+0

Quando si mescola, memorizzare l'ora in NSUserDefaults. In viewDidAppear (probabilmente l'opzione migliore per le tue esigenze), controlla l'ora corrente rispetto all'ora salvata in NSUserDefaults e determina se la mezzanotte è passata o meno. In tal caso, ri-shuffle e aggiorna NSUserDefaults con l'ora corrente per riflettere l'ultima shuffle. – rog

+0

puoi darmi qualche esempio di codice. Ho provato a farlo funzionare ma non riesco a farlo. 'timeIntervalSinceNow' restituisce il tempo in secondi tra due date. Se l'utente apre l'app alle 23:45 e poi di nuovo alle 00:01 sono passati solo 16mins (960s). Quindi <86400 sono passati ma è il giorno dopo. Un confronto con 'NSDayCalendarUnit' di entrambe le date funziona? (se non sono == poi shuffle) – RoshDamunki

Problemi correlati