使用管理器保存和读取数据

虽然你可以在任何地方使用 NSUserDefaults 方法,但有时可以更好地定义一个管理器,为你保存和读取 NSUserDefaults,然后使用该管理器读取或写入数据。

假设我们想将用户的分数保存到 NSUserDefaults 中。我们可以创建一个类似下面的类,它有两种方法:setHighScorehighScore。在你想要访问高分的任何地方,创建此类的实例。

迅速

public class ScoreManager: NSObject {

    let highScoreDefaultKey = "HighScoreDefaultKey"

    var highScore = {
        set {
            // This method includes your implementation for saving the high score
            // You can use NSUserDefaults or any other data store like CoreData or
            // SQLite etc.
    
            NSUserDefaults.standardUserDefaults().setInteger(newValue, forKey: highScoreDefaultKey)
            NSUserDefaults.standardUserDefaults().synchronize()
        }
        get {
        //This method includes your implementation for reading the high score

            let score = NSUserDefaults.standardUserDefaults().objectForKey(highScoreDefaultKey)
    
            if (score != nil) {
                return score.integerValue;
            } else {
                //No high score available, so return -1
                return -1;
            }
        }
    }
}

Objective-C

#import "ScoreManager.h"

#define HIGHSCRORE_KEY @"highScore"

@implementation ScoreManager

- (void)setHighScore:(NSUInteger) highScore {
    // This method includes your implementation for saving the high score
    // You can use NSUserDefaults or any other data store like CoreData or
    // SQLite etc.

    [[NSUserDefaults standardUserDefaults] setInteger:highScore forKey:HIGHSCRORE_KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

- (NSInteger)highScore
{

    //This method includes your implementation for reading the high score

    NSNumber *highScore = [[NSUserDefaults standardUserDefaults] objectForKey:HIGHSCRORE_KEY];
    if (highScore) {
        return highScore.integerValue;
    }else
    {
        //No high score available, so return -1

        return -1;
    }

}

@end

优点是:

  1. 你的读写过程的实现只在一个地方,你可以随时更改它(例如从 NSUserDefaults 切换到 Core Data),而不必担心更改所有使用高分的地方。

  2. 当你想要访问得分或写入时,只需调用一种方法。

  3. 当你看到一个 bug 或类似的东西时,只需调试它。

注意

如果你担心同步,最好使用管理同步的单例类。