制作一些代码只运行一次

Jez*_*mas 27 objective-c ios

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

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

这是我的想法:

MainViewController.h

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

@property (nonatomic, assign) BOOL hasRun;
Run Code Online (Sandbox Code Playgroud)

MainViewController.m

@synthesize hasRun;

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

有任何想法吗?

And*_*rey 79

斯威夫特1,2:

static var token: dispatch_once_t = 0

dispatch_once(&token) {
  NSLog("Do it once")
}
Run Code Online (Sandbox Code Playgroud)

Objective-C的

static dispatch_once_t once;
dispatch_once(&once, ^ {
  NSLog(@"Do it once");
});
Run Code Online (Sandbox Code Playgroud)

斯威夫特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.
Run Code Online (Sandbox Code Playgroud)

  • 请注意,每次将应用程序加载到内存中时这是一次.对于正在创建的此类的另一个实例(最近这个位),代码将不再运行,当应用程序从暂停状态返回到前台时,也不会再次运行代码. (24认同)
  • +1; 与在类中维护BOOL状态相比,GCD是此任务的更简洁选择 (2认同)

Dyl*_*lan 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;
    }
}
Run Code Online (Sandbox Code Playgroud)