2013-10-05 2 views
20

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

+8

Какой тип данных вы пытаетесь сохранить и сколько? –

ответ

25

Предположим, вы хотите сохранить оценку и уровень, которые являются одновременно свойствами объекта, называемого 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 (который, как правило, быстро & грязный путь к решению).

9

Вы можете сохранить данные в CoreData, SqlLite или NSUserDefaults Update Realm также вариант и очень легко реализовать.

+9

Или простой плоский файл, возможно содержащий данные в представлении JSON или формате CSV. –

+0

который безопасен? –

+1

Если у вас есть что-то чувствительное, то не храните его в NSUserDefaults. Попробуйте сохранить в других, например Realm sql или core data, и используйте шифрование. если у вас мало таких вещей, как токен, имя пользователя и пароль, используйте keychain –

10

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

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

0

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

0

Swift 3

Использование UserDefaults

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

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

1

Есть несколько способов, чтобы сохранить данные в ИОС.

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

исх - http://www.thomashanning.com/data-persistence-ios/

Смежные вопросы