Я делаю игру, и когда я закрываю приложение (рядом с менеджером многозадачности), все мои данные ушли! Итак, мой вопрос очень прост: Как сохранить данные?
Как сохранить данные в iOS
Ответ 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 - лучший способ для небольшого количества объектов.//Я так думаю.
Ответ 5
Я рекомендую использовать Realm для более обобщенных решений.
Ответ 6
Swift 3
Используйте UserDefaults
UserDefaults.standard.set(„some value", „key")
let value = UserDefaults.standard.string(„key")
Вы можете даже сохранить массив, используя этот