How to run a line of code only once for a class
我正在为iOS应用程序创建一个处理所有数据库函数的类。目前,我只有一个类方法来保存数据。在其中,我创建了一个数据库和一个表。然后,我开始保存数据。每次调用此方法时都会发生这种情况。但是,我只处理具有单个表的单个数据库,因此我希望所有这一切只发生一次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #import <sqlite3.h> #import"LocalDatabase.h" @implementation LocalDatabase + (void)saveData:(id)sender { /* create database (if it doesnt exist) */ sqlite3 *database = nil; NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"db.sql"]; if(sqlite3_open([path UTF8String], &database) != SQLITE_OK) { NSLog(@"Failed to open database"); } /* create table (if it doesnt exist) */ char *err; NSString *statement = @"CREATE TABLE IF NOT EXISTS DATA (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, CATEGORY TEXT)"; if (sqlite3_exec(database, statement, NULL, NULL, &err) != SQLITE_OK) { NSLog(@"Failed to create table"); } /* save data */ // some code that uses database } @end |
我不太了解静态变量如何在目标中工作,但我认为以下代码是正确的:
1 2 3 4 5 6 7 8 9 10 11 | #import"A.h" @implementation A static NSString *b = @"TEXT!!"; + (void) c { //do stuff with b } @end |
我相信这只会将
1 2 3 4 5 6 7 8 9 10 11 | #import"A.h" @implementation A static NSString *b = [NSString stringWithFormat:@"%@",@"TEXT!!!"]; + (void) c { //do stuff with b } @end |
这意味着我不能以这种方式在赋值中进行方法调用。另外,我不能有if语句等。有什么办法我只能这样做一次吗?我只能这样做一次。当然,我可以创建一个单独的类方法来初始化,或者创建一个静态布尔值来跟踪我是否已经初始化了,但是我想知道是否有一种更干净的方法。
在方法内部使用类似的方法:
1 2 3 4 | static dispatch_once_t pred; dispatch_once(&pred, ^{ // stuff to do only once }); |
1 2 3 4 5 6 7 8 9 | + (instancetype)sharedDatabase { static LocalDatabase *_sharedDatabase = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedDatabase = [[self alloc] init]; }); return _sharedDatabase; } |
它将返回类localdatabase的实例。
发送一次参考