Вопрос:

Создание кода выполняется только один раз

objective-c ios

16194 просмотра

4 ответа

11343 Репутация автора

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

Есть идеи?

Автор: Jezen Thomas Источник Размещён: 05.03.2012 06:10

Ответы (4)


7 плюса

126 Репутация автора

Я не вижу никаких проблем с этим кодом. Мне нравится использовать 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;
    }
}
Автор: Dylan Размещён: 05.03.2012 06:18

79 плюса

1056 Репутация автора

Решение

Свифт 1,2:

static var token: dispatch_once_t = 0

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

Objective-C

static dispatch_once_t once;
dispatch_once(&once, ^ {
  NSLog(@"Do it once");
});

Свифт 3,4:

dispatch_once больше не доступен в Swift. В 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.
Автор: Andrey Размещён: 05.03.2012 06:46

-2 плюса

3810 Репутация автора

С 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()")
}
Автор: Tai Le Размещён: 14.11.2015 04:58

-2 плюса

310 Репутация автора

для Swift2.2, Xcode 7.3:

static var token: dispatch_once_t = 0

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

Берегись " YourClassName.token"

Автор: PeiweiChen Размещён: 18.04.2016 04:41
Вопросы из категории :
32x32