Подтвердить что ты не робот

Запуск некоторого кода только один раз

У меня есть код, который я бы хотел запустить только один раз в моем 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;
    }
}

Любые идеи?

4b9b3361

Ответ 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")
}

Ответ 2

Я не вижу никаких проблем с этим кодом. Мне нравится использовать BOOL (как и вы), а затем назначая либо YES/NO, либо TRUE/FALSE, чтобы код читался более красиво. Я бы назначил TRUE для firstRun в didFinishLaunching и установил FALSE после выполнения кода. В моем коде эти условные обозначения обычно выглядят следующим образом:

@synthesize firstRun;

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

Ответ 3

С 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()")
}

Ответ 4

для Swift2.2, Xcode 7.3:

static var token: dispatch_once_t = 0

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

Остерегайтесь "YourClassName.token"