使一些代码只运行一次

问题描述:

我有一些代码,我想在我的MainViewController只运行一次。它应该在用户每次启动应用程序时运行,但只能在加载MainViewController后运行。使一些代码只运行一次

我不想在-(void)applicationDidFinishLaunching:(UIApplication *)application运行它。

这里是我提出的想法:

MainViewController.h

@interface IpadMainViewController : UIViewController <UISplitViewControllerDelegate> { 
    BOOL hasRun; 
} 

@property (nonatomic, assign) BOOL hasRun; 

MainViewController.m

@synthesize hasRun; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    if (hasRun == 0) { 
     // Do some stuff 
     hasRun = 1; 
    } 
} 

任何想法?

+0

你试过你的代码? – Jim 2012-03-05 18:12:45

+0

哪些错误与运行' - (空)的applicationDidFinishLaunching:(UIApplication的*)application'或你的代码?或者,如果你不ALLOC你MainViewCOntroller,它会被运行一次,反正 – Seega 2012-03-05 18:13:32

+1

一旦每_activation_(即,一旦在发射时再从后台返回),或每一次它被加载到内存中? – 2012-03-05 18:14:47

您可以使用dispatch_once

Objective-C的

static dispatch_once_t once; 
dispatch_once(&once,^{ 
    NSLog(@"Do it once"); 
}); 

斯威夫特

static var token: dispatch_once_t = 0 

dispatch_once(&token) { 
    NSLog("Do it once") 
} 
+2

+1; GCD对于此任务来说是一个更清洁的选择,而不是在您的班级中维护BOOL状态 – 2012-03-05 19:01:47

+23

请注意,这是每个应用程序加载到内存中的一次。该代码将不会再次为该类的另一个实例(最近这个位置)运行,也不会在应用程序从暂停状态返回到前台时再次运行。 – 2012-03-05 19:21:18

+0

很棒的回答。这感觉比我最初的想法更优雅。我学到了一些东西。谢谢! – 2012-03-05 19:48:06

我没有看到该代码的任何问题。我喜欢使用BOOL(如你所做的那样),然后分配YES/NO或TRUE/FALSE,以便代码读得更好。我将在didFinishLaunching中将first赋给TRUE,并在代码执行后将其设置为FALSE。在我的代码,这些类型的条件句通常是这样的:

@synthesize firstRun; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    if (firstRun) { 
     // code to run only once goes here 
     firstRun = FALSE; 
    } 
} 
+0

建议Grand Central Dispatch的另一个答案可以说是更好的方法。另一方面,考虑到这是一个“基本”问题,作为BSD级别的技术,它具有相当陡峭的学习曲线。如果你想要做你所要求的,那么这段代码比你的原始代码稍微干净 - 如果你想尝试更高级的任务管理方法,GCD非常强大。 – Dylan 2012-03-05 19:19:38

随着Swift2.0时,Xcode 7.0

var token: dispatch_once_t = 0 

override func viewDidLoad() { 
    super. viewDidLoad() 
    dispatch_once(&token) { 
     println("This is printed only on the first call to test()") 
    } 
    println("This is printed for each call to test()") 
} 

为Swift2.2时,Xcode 7.3:

static var token: dispatch_once_t = 0 

dispatch_once(&YourClassName.token) { 
    NSLog("Do it once") 
} 

当心 “YourClassName.token