我有一些代码,我想在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 :(得分:78)
Swift 1,2:
static var token: dispatch_once_t = 0
dispatch_once(&token) {
NSLog("Do it once")
}
<强>目标C 强>
static dispatch_once_t once;
dispatch_once(&once, ^ {
NSLog(@"Do it once");
});
Swift 3,4:
在Swift中不再提供dispatch_once。在Swift中,您可以使用 懒惰地初始化全局变量或静态属性并得到相同的结果 线程安全和被叫一次保证为dispatch_once提供 Apple doc
let myGlobal = { … global contains initialization in a call to a closure … }()
_ = myGlobal // using myGlobal will invoke
// the initialization code only the first time it is used.
答案 1 :(得分:7)
我没有看到该代码有任何问题。我喜欢使用BOOL(就像你一样),然后分配YES / NO或TRUE / FALSE,以便代码读得更好。我会在didFinishLaunching中为firstRun指定TRUE,并在代码执行后将其设置为FALSE。在我的代码中,这些类型的条件通常如下所示:
@synthesize firstRun;
-(void)viewDidLoad {
[super viewDidLoad];
if (firstRun) {
// code to run only once goes here
firstRun = FALSE;
}
}
答案 2 :(得分:0)
由于swift 3及以上没有dispatch_once_t,我们可以使用延迟初始化的全局变量。
创建一个懒惰的全局变量
lazy var doOnlyOnce: () -> Void = {
.. add code to run only once here ..
return {}
}()
运行代码:
_ = doOnlyOnce
答案 3 :(得分:0)
可能的变化(Swift 5):
// Whether this is the first code run since app (re)started
var firstRun: Bool = true
public final class Foo {
public init() {
if firstRun {
// Code that has to be run only once goes
// HERE
firstRun = false
}
}
}
答案 4 :(得分:-2)
使用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()")
}
答案 5 :(得分:-2)
对于Swift2.2,Xcode 7.3:
static var token: dispatch_once_t = 0
dispatch_once(&YourClassName.token) {
NSLog("Do it once")
}
小心“YourClassName.token
”