关于ios:如何为一个类只运行一行代码

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

我相信这只会将@"TEXT!!!"分配给NSString *b一次。我想我可以用这个来解决我的问题。但是,我意识到以下内容无法编译:

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的实例。

发送一次参考