Obecnie pracuję nad aplikacją na iOS opracowaną w Swift i muszę przechowywać na urządzeniu niektóre treści utworzone przez użytkowników, ale nie mogę znaleźć prostego i szybkiego sposobu na przechowywanie / odbieranie treści użytkowników na urządzeniu.
Czy ktoś mógłby wyjaśnić, jak przechowywać i uzyskiwać dostęp do lokalnej pamięci masowej?
Chodzi o to, aby przechowywać dane, gdy użytkownik wykonuje akcję, i otrzymywać je po uruchomieniu aplikacji.
ios
swift
nsuserdefaults
Nicklas Ridewing
źródło
źródło
Odpowiedzi:
Najprostszym rozwiązaniem, jeśli przechowujesz tylko dwa ciągi, jest to
NSUserDefaults
, że w języku Swift 3 nazwa tej klasy została zmieniona na justUserDefaults
.Najlepiej przechowywać klucze w dowolnym miejscu na świecie, aby można było ich ponownie użyć w innym miejscu kodu.
Swift 3.0, 4.0 i 5.0
Swift 2.0
W przypadku czegokolwiek poważniejszego niż drobna konfiguracja, flagi lub ciągi bazowe, powinieneś użyć jakiegoś trwałego magazynu - popularną opcją w tej chwili jest Realm, ale możesz również użyć własnych CoreData SQLite lub Apples .
źródło
setValue(_:forKey:)
do zapisywania danych w UserDefaults. Skorzystaj z podanychUserDefaults
metodset(_:forKey:)
(w Swift 3).Mówią, że użyj NSUserDefaults
Kiedy po raz pierwszy wdrażałem długoterminowe (po zamknięciu aplikacji) przechowywanie danych, wszystko, co przeczytałem w Internecie, wskazywało na NSUserDefaults. Chciałem jednak przechowywać słownik i choć było to możliwe, okazywało się to uciążliwe. Spędziłem godziny, próbując usunąć błędy typu.
NSUserDefaults ma również ograniczoną funkcję
Dalsze czytanie ujawniło, jak odczyt / zapis NSUserDefaults naprawdę zmusza aplikację do odczytu / zapisu wszystkiego lub niczego naraz, więc nie jest to wydajne. Wtedy dowiedziałem się, że pobieranie tablicy nie jest proste. Zdałem sobie sprawę, że jeśli przechowujesz więcej niż kilka ciągów znaków lub wartości logicznych, NSUserDefaults naprawdę nie jest idealne.
Nie jest też skalowalne. Jeśli uczysz się kodować, naucz się skalowalnego sposobu. Używaj NSUserDefaults tylko do przechowywania prostych łańcuchów lub wartości logicznych związanych z preferencjami. Przechowuj tablice i inne dane za pomocą danych podstawowych, to nie jest tak trudne, jak mówią. Zacznij od czegoś małego.
Aktualizacja: Ponadto, jeśli dodasz obsługę Apple Watch, istnieje inny potencjalny czynnik. NSUserDefaults Twojej aplikacji jest teraz automatycznie wysyłane do rozszerzenia Watch.
Korzystanie z danych podstawowych
Zignorowałem więc ostrzeżenia, że Core Data jest trudniejszym rozwiązaniem i zacząłem czytać. W ciągu trzech godzin sprawiłem, że zadziałało. Moja tablica tabel została zapisana w danych podstawowych i ponownie załadowana po otwarciu kopii zapasowej aplikacji! Kod samouczka był dość łatwy do zaadaptowania i mogłem przechowywać w nim tablice tytułów i szczegółów z niewielkim dodatkowym eksperymentowaniem.
Dlatego każdy, kto czyta ten post, boryka się z problemami związanymi z typem NSUserDefault lub potrzebuje czegoś więcej niż przechowywanie ciągów znaków, może rozważyć spędzenie godziny lub dwóch na zabawie z podstawowymi danymi.
Oto samouczek, który przeczytałem:
http://www.raywenderlich.com/85578/first-core-data-app-using-swift
Jeśli nie zaznaczyłeś „Dane podstawowe”
Jeśli nie zaznaczyłeś opcji „Dane podstawowe” podczas tworzenia aplikacji, możesz dodać ją później i zajmie to tylko pięć minut:
http://craig24.com/2014/12/how-to-add-core-data-to-an-existing-swift-project-in-xcode/
http://blog.zeityer.com/post/119012600864/adding-core-data-to-an-existing-swift-project
Jak usunąć z list podstawowych danych
Usuń dane z Coredata Swift
źródło
Okey, więc dzięki @bploatacji i linkowi do http://www.codingexplorer.com/nsuserdefaults-a-swift-introduction/
Przekonałem się, że odpowiedź jest dość prosta w przypadku podstawowego przechowywania ciągów.
Podsumowałem to tutaj http://ridewing.se/blog/save-local-data-in-swift/
źródło
Używanie NSCoding i NSKeyedArchiver to kolejna świetna opcja dla danych, które są zbyt złożone
NSUserDefaults
, ale dla których CoreData byłoby przesadą. Daje również możliwość bardziej jawnego zarządzania strukturą plików, co jest świetne, jeśli chcesz używać szyfrowania.źródło
W przypadku Swift 4.0 stało się to łatwiejsze:
źródło
Swift 3.0
Setter: pamięć lokalna
Getter: pamięć lokalna
źródło
Dla Swift 3
źródło
Dla kogoś, kto z jakiegoś powodu nie chciałby obsługiwać UserDefaults, istnieje inna opcja - NSKeyedArchiver i NSKeyedUnarchiver. Pomaga zapisywać obiekty do pliku za pomocą archiwizatora i ładować zarchiwizowany plik do oryginalnych obiektów.
Napisałem proste narzędzie do zapisywania / ładowania obiektów w lokalnej pamięci, użyłem przykładowych kodów powyżej. Może zechcesz to zobaczyć. https://github.com/DragonCherry/LocalStorage
źródło
Swift 5+
Żadna z odpowiedzi tak naprawdę nie obejmuje szczegółowo domyślnych wbudowanych funkcji lokalnej pamięci masowej. Potrafi znacznie więcej niż tylko struny.
Dostępne są następujące opcje pochodzące bezpośrednio z dokumentacji Apple dotyczące „pobierania” danych z ustawień domyślnych.
Oto opcje „ustawienia”
Jeśli przechowujesz takie rzeczy, jak preferencje, a nie duży zestaw danych, są to doskonałe opcje.
Podwójny przykład :
Oprawa:
Pierwsze:
Co ciekawe w jednym z getterów jest DictionaryRepresentation , ten poręczny getter weźmie wszystkie typy danych, niezależnie od tego, czym one są i umieści je w ładnym słowniku, do którego można uzyskać dostęp za pomocą nazwy ciągu i poda poprawny odpowiedni typ danych, gdy o to poprosisz to z powrotem, ponieważ jest typu „any” .
Można przechowywać własnych klas i obiektów, również za pomocą
func set(Any?, forKey: String)
ifunc object(forKey: String) -> Any?
setter i getter odpowiednio.Mam nadzieję, że to wyjaśnia więcej możliwości klasy UserDefaults do przechowywania danych lokalnych.
Pamiętając o tym, ile należy przechowywać i jak często, Hardy_Germany udzielił dobrej odpowiedzi na to w tym poście , oto cytat z tego
Coś jeszcze, o czym wspomniał użytkownik Mohammad Reza Farahani z tego postu, to asynchroniczny i synchronicznyInną rzeczą wartą charakter userDefaults.
Na przykład, jeśli zapiszesz i szybko zamkniesz program, możesz zauważyć, że nie zapisuje on wyników, jest tak, ponieważ utrzymuje się asynchronicznie. Możesz nie zauważyć tego przez cały czas, więc jeśli planujesz oszczędzać przed zamknięciem programu, możesz to uwzględnić, dając mu trochę czasu na zakończenie.
Może ktoś ma na to fajne rozwiązania, którymi mógłby się podzielić w komentarzach?
źródło
NsUserDefaults zapisuje tylko małe rozmiary zmiennych. Jeśli chcesz zapisać wiele obiektów, możesz użyć CoreData jako rozwiązania natywnego lub stworzyłem bibliotekę, która pomaga ci zapisywać obiekty tak łatwo, jak funkcja .save (). Opiera się na SQLite.
SundeedQLite
Sprawdź to i powiedz mi swoje komentarze
źródło