ios - 如何为一个类只运行一次代码

标签 ios objective-c static-members class-method

我正在为我的 iOS 应用程序创建一个类来处理我的所有数据库功能。目前,我有一个可以保存数据的类方法。在其中,我创建了一个数据库和一个表。然后,我开始保存数据。每次调用此方法时都会发生这种情况。但是,我只处理带有单个表的单个数据库,所以我希望这一切只发生一次。

#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

我不太了解静态变量在Objective中的工作原理,但我认为以下代码是正确的:
#import "A.h"

@implementation A

static NSString *b = @"TEXT!!";

+ (void) c {
    //do stuff with b
}

@end

我相信这分配了 @"TEXT!!!"NSString *b只有一次。我想我可以用它来解决我的问题。但是,我意识到以下内容无法编译:
#import "A.h"

@implementation A

static NSString *b = [NSString stringWithFormat:@"%@",@"TEXT!!!"];

+ (void) c {
    //do stuff with b
}

@end

这意味着我不能以这种方式在分配中进行方法调用。另外,我不能有 if 语句等。有什么方法我可以只做一次,就像它一样 static NSString *b = @"TEXT!!";只有一次?当然,我可以为初始化创建一个单独的类方法,或者创建一个静态 bool 值来跟踪我是否已经初始化,但我想知道是否有更简洁的方法。

最佳答案

在你的方法中使用这样的东西:

static dispatch_once_t pred;
dispatch_once(&pred, ^{
    // stuff to do only once
});

关于ios - 如何为一个类只运行一次代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22596110/

相关文章:

ios - 动态标签文本,行间距+自定义行宽度

ios - 使用 detailview 中的按钮通过 masterTableView,但是当值大于/小于 tableview 中的行数时按钮消失

ios - 此帐户的内部分发配置文件将在程序激活两周后可用

iphone - 清晰的上下文图形

objective-c - 为什么 "conformsToProtocol"不检查 "required"方法实现?

objective-c - 隐藏在 iOS 9 中的附件栏

c++ - 静态对象的名称管理

objective-c - 排序NSDictionary

java - 使用静态变量Android更新时间

c++ - 静态函数输出与普通 fn 输出不同