Подтвердить что ты не робот

Как сохранить данные в iOS

Я делаю игру, и когда я закрываю приложение (рядом с менеджером многозадачности), все мои данные ушли! Итак, мой вопрос очень прост: Как сохранить данные?

4b9b3361

Ответ 1

Предположим, вы хотите сохранить оценку и уровень, которые являются одновременно свойствами объекта, называемого dataHolder.

DataHolder может быть создан как одноэлементный, так что вам не нужно слишком беспокоиться о том, откуда вы обращаетесь к нему (его sharedInstance на самом деле):

Этот код выглядел бы примерно так:

DataHolder.h

#import <Foundation/Foundation.h>

@interface DataHolder : NSObject 

+ (DataHolder *)sharedInstance;

@property (assign) int level;
@property (assign) int score;

-(void) saveData;
-(void) loadData;

@end

DataHolder.m

NSString * const kLevel = @"kLevel";
NSString * const kScore = @"kScore";

@implementation DataHolder

- (id) init
{
    self = [super init];
    if (self)
    {
        _level = 0;
        _score = 0;
    }
    return self;
}

+ (DataHolder *)sharedInstance
{
    static MDataHolder *_sharedInstance = nil;
    static dispatch_once_t onceSecurePredicate;
    dispatch_once(&onceSecurePredicate,^
                  {
                      _sharedInstance = [[self alloc] init];
                  });

    return _sharedInstance;
}

//in this example you are saving data to NSUserDefault's
//you could save it also to a file or to some more complex
//data structure: depends on what you need, really

-(void)saveData
{
    [[NSUserDefaults standardUserDefaults] 
        setObject:[NSNumber numberWithInt:self.score] forKey:kScore];

    [[NSUserDefaults standardUserDefaults] 
        setObject:[NSNumber numberWithInt:self.level] forKey:kLevel];

    [[NSUserDefaults standardUserDefaults] synchronize];
}

-(void)loadData
{
    if ([[NSUserDefaults standardUserDefaults] objectForKey:kScore])
    {
        self.score = [(NSNumber *)[[NSUserDefaults standardUserDefaults] 
            objectForKey:kScore] intValue];

        self.level = [(NSNumber *)[[NSUserDefaults standardUserDefaults] 
            objectForKey:kLevel] intValue];
    }
    else
    {
        self.level = 0;
        self.score = 0;
    } 
}

@end

Не забудьте указать #import "DataHolder.h", где он вам нужен, или просто поместите его в ...-Prefix.pch.

Вы можете выполнить фактическую загрузку и сохранение в методах appDelegate:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [[DataHolder sharedInstance] saveData];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [[DataHolder sharedInstance] loadData];
}

Вы можете получить доступ к своим данным и данным уровня из любого места с помощью [DataHolder sharedInstance].score и [DataHolder sharedInstance].level.

Это может показаться излишним для простой задачи, но это помогает поддерживать порядок вещей, и это может помочь вам избежать хранения всех данных в appDelegate (что обычно является быстрым и грязным путем к решению).

Ответ 2

[NSUserDefaults standardUserDefaults] хорош для небольших объемов данных, таких как пользовательские настройки и предпочтения. Обычно вы используете это, чтобы пользователи могли сохранять различные биты данных, которые определяют глобальные значения, такие как предпочтения персонажа, предпочтения в отношении оружия, что угодно и т.д.

Для больших объемов данных, таких как детали уровня игры или достижения или инвентарь оружия и т.д. Вы захотите использовать что-то вроде Core Data. Это более формальная база данных, которая может быть легко перенесена по мере изменения вашей схемы данных. Смотрите документы здесь: Основные данные и Руководство по программированию основных данных

Ответ 3

Вы можете сохранить данные в CoreData, SqlLite или NSUserDefaults Обновление Realm также является опцией и очень легко реализуется.

Ответ 4

Существует несколько способов сохранения данных в ios.

  • UserDefaults - отличный способ сохранить небольшой объем данных.
  • Брелок для ключей - безопасное место для безопасных высокочувствительных данных, таких как данные входа и пароли.
  • База данных Sqlite - если ваше приложение имеет огромное количество структурированных данных
  • CoreData - на основе графа объектов, который описывает объекты, которые следует сохранить
  • Сохранение файлов. Конечно, вы также можете напрямую сохранять все типы файлов в файловой системе. Однако вы можете просто получить доступ к файловой системе в контейнере приложения из-за соображений безопасности.
  • Использование базы данных Realm - лучшая альтернатива Core Data и SQLite db
  • NSKeyedArchiver и NSKeyedUnarchiver - лучший способ для небольшого количества объектов.//Я так думаю.

ref - http://www.thomashanning.com/data-persistence-ios/

Ответ 5

Я рекомендую использовать Realm для более обобщенных решений.

Ответ 6

Swift 3

Используйте UserDefaults

UserDefaults.standard.set(„some value", „key")
let value = UserDefaults.standard.string(„key")

Вы можете даже сохранить массив, используя этот