Создание кода выполняется только один раз
16194 просмотра
4 ответа
У меня есть код, который я хотел бы запустить только один раз в моем 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 Источник Размещён: 13.11.2019 11:32Ответы (4)
79 плюса
Свифт 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
7 плюса
Я не вижу никаких проблем с этим кодом. Мне нравится использовать 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
-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()")
}
Автор: Tai Le
Размещён: 14.11.2015 04:58
-2 плюса
для Swift2.2, Xcode 7.3:
static var token: dispatch_once_t = 0
dispatch_once(&YourClassName.token) {
NSLog("Do it once")
}
Берегись " YourClassName.token
"
Вопросы из категории :
- objective-c Приложение для iPhone в ландшафтном режиме, системы 2008
- objective-c Как программно отправить смс на айфон?
- objective-c Открытие нестандартного URL в приложении Какао
- objective-c Каков наилучший способ перетащить NSMutableArray?
- objective-c Как работает пул автозапуска NSAutoreleasePool?
- objective-c Как вы можете создать Makefile из проекта Xcode?
- objective-c Скругленные углы на UIImage
- objective-c Как мне создать временный файл с Какао?
- objective-c Как распечатать трассировку стека на консоль / журнал в Cocoa?
- objective-c @class vs. #import
- ios Как мне дать моим веб-сайтам значок для iPhone?
- ios Как я могу разработать для iPhone, используя машину для разработки Windows?
- ios Tips for a successful AppStore submission?
- ios Как мне определить размер UITextView для его содержимого?
- ios iPhone viewWillAppear не стреляет
- ios Как показать индикатор загрузки в верхней строке состояния
- ios Как сохранить картинку в фотобиблиотеку iPhone?
- ios Как отключить выбор UITableView?