Как запустить код только один раз? - PullRequest
4 голосов
/ 29 марта 2011

Я работаю над приложением для iPhone, и мне интересно, смогу ли я запустить какой-то сегмент кода только один раз (другими словами: код инициализации, который я хочу, чтобы он выполнялся только при первом запуске),Вот мой код, который я выполняю по методу didFinishLaunchingwithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

// Override point for customization after application launch.

// Add the tab bar controller's view to the window and display.
[self.window addSubview:tabBarController.view];
[self.tabBarController setSelectedIndex:2];
[self.window makeKeyAndVisible];

[self createPlist1];
[self createPlist2];
[self createPlist3];

return YES;

}

Я хочу, чтобы последние три сообщения были выполнены только при самом первом запуске.Я подумал, что мог бы использовать UserDefaults и установить ключ после выполнения этих сообщений (при первом запуске) и проверять значение этого ключа при каждом запуске, но я чувствую, что есть лучшая идея - которую я не знаю.

Заранее спасибо.

Ответы [ 6 ]

11 голосов
/ 29 марта 2011

Использование настройки (через NSUserDefaults) - это то, как это обычно делается.Для дополнительной выгоды задайте для параметра значение «последняя версия»;таким образом, вы получите возможность запускать код не только один раз за время жизни приложения, но и один раз за обновление версии.Эти списки, возможно, куда-то уходят.Таким образом, вы можете проверить, существуют ли они, прежде чем создавать их.Используйте результат кода однократного запуска в качестве триггера для его повторного запуска.

РЕДАКТИРОВАТЬ:

NSUserDefaults *Def = [NSUserDefaults standardUserDefaults];
NSString *Ver = [Def stringForKey:@"Version"];
NSString *CurVer = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey];
if(Ver == nil || [Ver compare:CurVer] != 0)
{
    if(Ver == nil)
    {
        //Run once per lifetime code
    }
    //Run once-per-upgrade code, if any
    [Def setObject:CurVer forKey:@"Version"];
}
3 голосов
/ 24 декабря 2014

Гораздо более простое возможное решение ->

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FirstTimeBool"]==nil)
{
    [defaults setObject:@"YES" forKey:@"FirstTimeBool"];
    ... //Code to be executed only once until user deletes the app!
    ...
2 голосов
/ 08 марта 2013

вот что я использовал:

static dispatch_once_t once;

dispatch_once(&once, ^ { 

    // run once code goes here

});
2 голосов
/ 29 марта 2011

Я думаю, что вы на правильном пути с пользовательскими настройками по умолчанию, что-то вроде:

-(BOOL)isInitialRun
{
     NSNumber *bRun = [[NSUserDefaults standardUserDefaults] valueForKey:@"initialRun"];
     if (!bRun) { return YES; }
     return [bRun boolValue];
}

-(void)setIsInitialRun:(BOOL)value
{
     [[NSUserDefaults standardUserDefaults] setBool:value forKey:@"initialRun"];
}

Тогда в вашем приложении делегат:

if ([self isInitialRun])
{
     [self createPlist1];
     [self createPlist2];
     [self createPlist3];
     [self setIsInitialRun:NO];
}
1 голос
/ 29 марта 2011

Насколько мне известно, способ, которым вы предлагаете, является единственным вариантом. Сохраните ключ в NSUserDefaults после его первого запуска и проверьте наличие указанного ключа.
Однако вы также можете проверить, что в каждой из ваших функций (функции createPlist1 - 3) выполнить проверку, если PList уже существует. Будет немного чище.

0 голосов
/ 17 июня 2012

Я бы добавил к @Seva Алексееву одну вещь:

После внесения каких-либо изменений (т. Е. [Def setObject:CurVer forKey:@"Version"];) вам следует позвонить [Def synchronize]

У меня была проблема, когда изменения, внесенные в NSUserDefaults с использованием setObject, не сохранялись, пока я не использовал синхронизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...