Ответ 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")
}
У меня есть код, который я бы хотел запустить только один раз в моем 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;
}
}
Любые идеи?
Вы можете использовать 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")
}
Я не вижу никаких проблем с этим кодом. Мне нравится использовать 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;
}
}
С 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()")
}
для Swift2.2, Xcode 7.3:
static var token: dispatch_once_t = 0
dispatch_once(&YourClassName.token) {
NSLog("Do it once")
}
Остерегайтесь "YourClassName.token
"