Tworzę grę, a kiedy zamykam aplikację (zamykam na menedżerze multitask), wszystkie moje dane zniknęły! Moje pytanie jest bardzo proste: Jak zapisać dane?Jak zapisywać dane w iOS
Odpowiedz
Załóżmy, że chcesz zapisać wynik i poziom, które są zarówno właściwościami obiektu o nazwie dataHolder.
DataHolder może być utworzony jako pojedyncza, więc nie trzeba się martwić zbytnio skąd ty do niego dostęp (jego sharedInstance
faktycznie):
Jest to kod będzie wyglądać trochę tak:
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
Nie zapomnij o #import "DataHolder.h" tam, gdzie jest to potrzebne, lub po prostu umieść go w ...-Prefix.pch
.
Można wykonać rzeczywiste ładowanie i zapisywanie w appDelegate
metod:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[DataHolder sharedInstance] saveData];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[[DataHolder sharedInstance] loadData];
}
można otworzyć swój wynik i poziom danych z dowolnego miejsca [DataHolder sharedInstance].score
i [DataHolder sharedInstance].level
.
To może wydawać się przesadą dla prostego zadania, ale z pewnością pomaga utrzymać porządek i może pomóc w uniknięciu przechowywania wszystkich danych w appDelegate
(co jest zazwyczaj szybką, nieostrą ścieżką do rozwiązania).
można zapisać dane w CoreData, SqlLite lub NSUserDefaults Aktualizuj królestwa jest także opcja i bardzo łatwe do wykonania.
Lub prosty plik płaski, być może zawierający dane w reprezentacji JSON lub formacie CSV. –
który z nich jest bezpieczny? –
Jeśli masz jakiś problem, nie przechowuj go w NSUserDefaults. Spróbuj zapisać w innych, takich jak Realm sql lub dane podstawowe i użyj szyfrowania. jeśli masz kilka rzeczy, takich jak nazwa użytkownika tokena i hasło, użyj keychain –
[NSUserDefaults standardUserDefaults]
jest dobre dla małych ilości danych, takich jak ustawienia i preferencje użytkownika. Zazwyczaj używa się tego, aby umożliwić użytkownikom zapisywanie różnych bitów danych, które definiują wartości globalne, takie jak preferencje dotyczące postaci, preferencje dotyczące broni, cokolwiek itp.
Dla większych ilości danych, takich jak szczegóły poziomu gry, osiągnięcia lub inwentaryzacja broni itp. Będziesz chciał użyć czegoś takiego jak Core Data. Jest to bardziej formalna baza danych, którą można łatwo migrować podczas zmiany schematu danych. Zobacz dokumentację tutaj: Core Data i Core Data Programming Guide
Polecam używanie Realm dla bardziej ogólnych rozwiązań.
Swift 3
Zastosowanie UserDefaults
UserDefaults.standard.set(„some value”, „key”)
let value = UserDefaults.standard.string(„key”)
Można nawet utrzymywać tablicę używając tego
Istnieje kilka sposobów, aby zapisać dane w systemie iOS.
- UserDefaults - świetny sposób na zapisanie niewielkiej ilości danych.
- Keychain - bezpieczna lokalizacja dla bezpieczeństwa ważnych danych, takich jak dane logowania i hasła.
- SQLite Database - Jeśli aplikacja posiada ogromną ilość danych strukturyzowanych
- CoreData - na podstawie wykresu obiektu, który opisuje obiekty, które powinny być zapisane
- Zapisywanie plików - Oczywiście można również bezpośrednio zapisać wszystkie rodzaje pliki do systemu plików. Można jednak uzyskać dostęp do systemu plików w kontenerze aplikacji ze względów bezpieczeństwa.
- Korzystanie z bazy danych Realm - najlepsza alternatywa dla danych Core oraz SQLite db
- NSKeyedArchiver i NSKeyedUnarchiver - lepszy sposób na niewielką ilością przedmiotów. // tak myślę
- 1. Jak zapisywać dane exif do obrazu w systemie Android?
- 2. Symulator iOS nie chce zapisywać zrzutów ekranu
- 3. Jak zapisywać ostrzeżenia i błędy jako dane wyjściowe z funkcji?
- 4. Firebase - Jak zapisywać/czytać dane na użytkownika po uwierzytelnieniu
- 5. dane zapisywać na dysk w Pythonie jako proces w tle
- 6. Jak zapisywać dane binarne do pliku przy użyciu pliku node.js?
- 7. Jak zapisywać dane przy użyciu FileOutputStream bez utraty starych danych?
- 8. Najlepsza strategia składowania danych podstawowych (kiedy zapisywać dane na dysku)
- 9. Czy procesy współbieżne mogą zapisywać dane w udostępnionej bazie danych?
- 10. otwierać i zapisywać dane zakodowane base64 obrazu URI w Ruby
- 11. pysqlite - jak zapisywać obrazy
- 12. Jak uzyskać dane przyspieszenia w IOS?
- 13. Jak zapisywać i zapisywać jako mp3 streaming online audio
- 14. Czy Jtable może zapisywać dane, gdy komórka traci ostrość?
- 15. Jak zapisywać dane w wielu wierszach, ALE w obrębie tej samej komórki CSV?
- 16. jak zapisywać obrazy wyświetlane w webview?
- 17. Jak zapisywać wiele plików w aplikacji chrome
- 18. Jak zapisywać hasła w Deweloperem PL/SQL?
- 19. Jak zapisywać wartości NSTimeInterval w obiekcie NSMutableArray?
- 20. iOS gdzie można lokalnie zapisywać obrazy, które można ponownie pobrać?
- 21. Dane podstawowe iOS - Relacje
- 22. ios - DANE PODSTAWOWE aktualizowanie rekordów
- 23. Jak zapisywać obrazy i nagrane pliki w katalogu tymczasowym?
- 24. Mongoose: Znajdź, modyfikować, zapisywać
- 25. Jak zapisywać surowe bajty do obiektu NSMutableData?
- 26. Gdzie można zapisywać pliki w piaskownicy w aplikacji Mac?
- 27. Jak edytować i zapisywać dane ViewModels z powrotem do bazy danych
- 28. Jak zapisywać i ładować linie rysunkowe iphone SDK
- 29. Czy mogę czytać i zapisywać dane w bazie danych SQLite jednocześnie z wielu połączeń?
- 30. iOS: Podstawowe dane i przestrzeń dyskowa
Jaki typ danych starasz się zaoszczędzić i ile? –