Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何只运行一次代码?_Iphone_Objective C_Cocoa Touch_Xcode - Fatal编程技术网

Iphone 如何只运行一次代码?

Iphone 如何只运行一次代码?,iphone,objective-c,cocoa-touch,xcode,Iphone,Objective C,Cocoa Touch,Xcode,我正在开发一个iPhone应用程序,我想知道我是否可以只运行一次某个代码段(换句话说:一个初始化代码,我希望它只在第一次运行时执行)。 这是我的代码,我在didfishlaunchingwithoptions方法执行它: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for c

我正在开发一个iPhone应用程序,我想知道我是否可以只运行一次某个代码段(换句话说:一个初始化代码,我希望它只在第一次运行时执行)。 这是我的代码,我在
didfishlaunchingwithoptions
方法执行它:

- (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,在这些消息执行后(在第一次运行时)设置一个键,并在每次运行时检查该键的值,但我觉得有一个更好的主意——我不知道


提前谢谢。

据我所知,你的提议是唯一的选择。首次运行密钥后,将其保存到NSUserDefaults,并检查是否存在所述密钥。
但是,您也可以签入每个函数(createPlist1-3函数),如果PList已经存在,则运行一个检查。会更干净一些。

使用设置(通过
NSUserDefaults
)是通常的做法。为了增加效益,将设置的含义设置为“上次运行版本”;这样,您将有机会不仅在每个应用生命周期中运行一次代码,而且在每个版本升级中也运行一次代码

也就是说,您的run-once代码具有持久的副作用,对吗?那些人可能去了什么地方。因此,您可以在创建它们之前检查它们是否存在。使用run once代码的结果作为再次运行它的触发器

编辑:


我认为您使用用户默认值是正确的,比如:

-(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];
}

我想在@Seva Alekseyev回答中补充一点:

进行任何更改(即
[Def setObject:CurVer forKey:@“Version”];
)后,应调用
[Def synchronize]

我遇到了一个问题,在我使用同步之前,使用setObject对NSUserDefaults所做的更改无法保存。

这就是我使用的:

static dispatch_once_t once;

dispatch_once(&once, ^ { 

    // run once code goes here

});

更简单的可能解决方案->

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!
    ...

好的和快的
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!
    ...