iOS:如何在没有数据库的情况下临时持久化数据?

Posted

技术标签:

【中文标题】iOS:如何在没有数据库的情况下临时持久化数据?【英文标题】:iOS: How to temporarily persist data without database? 【发布时间】:2015-08-14 14:25:16 【问题描述】:

我正在尝试制作一个用户回答问题的小游戏。整体流程是这样的:

    通过单击按钮选择难度级别(push segue) 玩家 1 输入名称,按“下一步”(push segue) 回答问题 回答问题 完成。 玩家 2 输入名称,按“下一步”(push segue) 回答问题 回答问题 完成。 看看大家的回答 被送回#1

我的问题是我真的不需要将用户信息(姓名、答案等)存储在数据库中,因为这些数据在回合结束后就没用了。但是,我需要它足够持久,以便我可以在回合结束之前跨视图控制器访问该数据。

对于难度级别,我使用 AppDelegate 上的自定义属性来保持设置:

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) NSString *difficultyLevel;

@end

DifficultyViewController.m

- (IBAction)setDifficultyLevel:(id)sender 
    UIButton *button = (UIButton *)sender;

    NSString *difficulty = [[button titleLabel] text];
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.difficultyLevel = difficulty;

PlayerProfileViewController.m

- (void)viewDidLoad 
    [super viewDidLoad];
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSLog(@"Edmund: %@", appDelegate.difficultyLevel);

但是,这感觉不是很有可扩展性,因为我将拥有许多其他属性,而且我不觉得 AppDelegate 的用途是什么。

有没有一种通用的方法来为这类事情持久化数据?

【问题讨论】:

为什么不创建一个单例类“SharedData”并将所有数据存储在那里? 【参考方案1】:

我认为你需要一个游戏经理。管理器通常用作单例,这意味着您将只有一个此类的实例。可能是这样的:

-头文件:

@interface GameManager : NSObject
@property (nonatomic, strong) NSString *difficultyLevel;
@property (nonatomic, strong) NSString *player1Name;
@property (nonatomic, strong) NSString *player2Name;
@end

-源文件:

@implementation GameManager

@synthesize difficultyLevel, player1Name, player2Name;

+ (id)sharedManager 
    static GameManager *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        sharedInstance = [[self alloc] init];
    );
    return sharedInstance;


- (id)init 
    if (self = [super init]) 
        // add what you need here
    
    return self;


@end

所以你会像这样更新你的代码:

- (IBAction)setDifficultyLevel:(id)sender 
    UIButton *button = (UIButton *)sender;

    NSString *difficulty = [[button titleLabel] text];
    GameManager *gameManager = [GameManager sharedInstance];
    gameManager.difficultyLevel = difficulty;

如果您愿意,您还可以在每个视图控制器中为您的管理器设置一个弱属性。

【讨论】:

谢谢!调度的东西到底是做什么的?那是来自C吗?它看起来不像客观 c 这是为了避免多个线程在“同一”时间创建一个单例实例。更多信息:mikeash.com/pyblog/…

以上是关于iOS:如何在没有数据库的情况下临时持久化数据?的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的数据库连接持久化

在没有数据持久性的情况下,如何最好地在 Django 中压缩表单:最 Djangonic 的方法是啥? [关闭]

我如何知道 zookeeper 节点是持久节点还是临时节点?

来了!PostgreSQL 同步流复制原理和代码浅析,请签收

Hibernate Session对象核心方法

java对象的序列化和反序列化