2013-03-19 4 views
5

У меня есть ViewController, который выполняет случайную перетасовку в массиве и выплескивает текст на метку (в методе viewDidLoad). Проблема в том, что всякий раз, когда я перехожу к одному и тому же ViewController, он снова выполняет перетасовку, и мне нужно только каждый раз перетасовывать один раз.Проверьте, загружен ли View с полуночи

Так что мне нужно проверить, был ли этот ViewController загружен раньше в один и тот же день (т. Е. С полуночи), и затем я могу поместить тасовку в оператор if. Могу ли я планировать перетасовку в полночь, независимо от того, открыто ли приложение или нет?

Я изучил настройку boolean на NSUserDefaults: что-то вроде hasLoadedSinceMidnight, но затем не может решить, как сбросить логическое значение в полночь.

+0

Это будет один из способов, но вам также нужно будет сохранить состояние предметов, которые вы «перетасовываете», и загружать их. –

+0

Объекты массива поступают из CoreData, поэтому они уже сохранены. Метод просто загружает их в массив и перемещает их в другой массив. – RoshDamunki

ответ

7

Вы могли бы реализовать метод significantTimeChange в AppDelegate в:

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

Этот метод называется каждый полночь, и во время значительных изменений времени, таких как изменение часового пояса. Если ваше приложение закрыто при получении события, этот метод будет вызываться, когда ваше приложение будет открыто.

Более подробную информацию можно посмотреть here

Дополнительный способ сделать то же самое внутри вашего ViewController, а не в AppDelegate можно было бы добавить:

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

, а затем вы можете просто исполняй свой shuffle в методе -(void)performAction; этого ViewController.

+1

+1 или лучше: подписаться на ['UIApplicationSignificantTimeChangeNotification'] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006728-CH3-SW44) в контроллере вида – vikingosegundo

+0

Это верно. Добавьте это. – Jsdodgers

+0

+1 Гораздо лучше, чем я предложил! – rog

0

Вместо того, чтобы хранить BOOL, вы могли сохранить дату/время (NSDate) последнего тасования.

Затем проверьте, прошло ли оно полночь с момента последнего перетасовки, сравнив сохраненную дату и текущую дату в viewDidAppear.

См NSTime Документация: http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html

И NSDateFormatter Документация: https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003643


UPDATE:

В соответствии с просьбой, вот некоторые примеры кода. По общему признанию, там очень хорошо могут быть лучшие решения, но я считаю, что этот фрагмент кода поможет вам преодолеть вашу проблему. Что это значит, проверьте, есть ли дата, сохраненная с использованием NSUserDefaults, а затем сравните ее с текущей датой. Если даты не совпадают, перетасуйте массив, затем сохраните текущую дату (снова используя NSUserDefaults). (Я взял на себя смелость сделать предположение о том, что время действительно будет продолжать двигаться вперед, так что это не проверить, чтобы убедиться, что lastSavedDate является перед тем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"]; 

На данный момент, у вас нет реальной причины проверять время, но я включил его, если вам было любопытно.

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

Интересно. Итак, создайте временную метку, когда View загружает и сохраняет это в 'NSUserDefaults'? Или просто выполните метод проверки в представлении? – RoshDamunki

+0

Когда вы перетасовываете, храните время в NSUserDefaults. В viewDidAppear (возможно, лучший вариант для ваших нужд), проверьте текущее время на время сохранения в NSUserDefaults и определите, прошло ли полночь. Если он имеет, повторно перетасовать и обновить NSUserDefaults с текущим временем, чтобы отразить последний случайный случай. – rog

+0

Можете ли вы дать мне пример кода. Я пытался заставить это работать, но не могу показаться. 'timeIntervalSinceNow' возвращает время в секундах между двумя датами. Если пользователь открывает приложение в 23:45, а затем снова в 00:01, прошло только 16 минут (960 секунд). Поэтому <86400s прошли, но на следующий день. Будет ли проведено сравнение с «NSDayCalendarUnit» обеих дат? (если они не == затем перетасовываются) – RoshDamunki

Смежные вопросы