制作一些代码只运行一次

时间:2012-03-05 18:10:49

标签: objective-c ios

我有一些代码,我想在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;
    }
}

有什么想法吗?

6 个答案:

答案 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