使一些代码只运行一次
我有一些代码,我想在我的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;
}
}
任何想法?
您可以使用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")
}
+1; GCD对于此任务来说是一个更清洁的选择,而不是在您的班级中维护BOOL状态 – 2012-03-05 19:01:47
请注意,这是每个应用程序加载到内存中的一次。该代码将不会再次为该类的另一个实例(最近这个位置)运行,也不会在应用程序从暂停状态返回到前台时再次运行。 – 2012-03-05 19:21:18
很棒的回答。这感觉比我最初的想法更优雅。我学到了一些东西。谢谢! – 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;
}
}
建议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
”
你试过你的代码? – Jim 2012-03-05 18:12:45
哪些错误与运行' - (空)的applicationDidFinishLaunching:(UIApplication的*)application'或你的代码?或者,如果你不ALLOC你MainViewCOntroller,它会被运行一次,反正 – Seega 2012-03-05 18:13:32
一旦每_activation_(即,一旦在发射时再从后台返回),或每一次它被加载到内存中? – 2012-03-05 18:14:47