Saat ini saya sedang mengerjakan aplikasi iOS yang dikembangkan di Swift dan saya perlu menyimpan beberapa konten yang dibuat pengguna di perangkat, tetapi sepertinya saya tidak bisa menemukan cara sederhana dan cepat untuk menyimpan / menerima konten pengguna di perangkat.
Bisakah seseorang menjelaskan cara menyimpan dan mengakses penyimpanan lokal?
Idenya adalah untuk menyimpan data ketika pengguna menjalankan suatu tindakan dan menerimanya saat aplikasi dimulai.
ios
swift
nsuserdefaults
Nicklas Ridewing
sumber
sumber
Jawaban:
Solusi paling sederhana jika Anda hanya menyimpan dua string adalah
NSUserDefaults
, di Swift 3 kelas ini telah diubah namanya menjadi adilUserDefaults
.Yang terbaik adalah menyimpan kunci Anda di suatu tempat secara global sehingga Anda dapat menggunakannya kembali di tempat lain dalam kode Anda.
Swift 3.0, 4.0 & 5.0
Swift 2.0
Untuk hal yang lebih serius daripada konfigurasi minor, flag atau string dasar, Anda harus menggunakan semacam toko persisten - Opsi yang populer saat ini adalah Realm tetapi Anda juga dapat menggunakan SQLite atau CoreData milik Apple sendiri .
sumber
setValue(_:forKey:)
untuk menyimpan data ke UserDefaults. GunakanUserDefaults
metode yang disediakanset(_:forKey:)
(dalam Swift 3).Mereka Mengatakan Menggunakan NSUserDefaults
Ketika saya menerapkan penyimpanan data jangka panjang (setelah aplikasi tutup) untuk pertama kalinya, semua yang saya baca online mengarahkan saya ke NSUserDefaults. Namun, saya ingin menyimpan kamus dan, meskipun mungkin, itu terbukti menyebalkan. Saya menghabiskan berjam-jam mencoba untuk mendapatkan kesalahan tipe untuk pergi.
Fungsi NSUserDefaults Juga Terbatas
Bacaan lebih lanjut mengungkapkan bagaimana membaca / menulis NSUserDefaults benar-benar memaksa aplikasi untuk membaca / menulis semuanya atau tidak sama sekali, sekaligus, sehingga tidak efisien. Kemudian saya belajar bahwa mengambil array tidak langsung. Saya menyadari bahwa jika Anda menyimpan lebih dari beberapa string atau boolean, NSUserDefaults benar-benar tidak ideal.
Ini juga tidak dapat diskalakan. Jika Anda mempelajari cara membuat kode, pelajari cara yang dapat diskalakan. Hanya gunakan NSUserDefaults untuk menyimpan string atau boolean sederhana yang terkait dengan preferensi. Menyimpan array dan data lainnya menggunakan Core Data, tidak sesulit yang mereka katakan. Mulailah dari yang kecil.
Pembaruan: Juga, jika Anda menambahkan dukungan Apple Watch, ada pertimbangan potensial lain. NSUserDefaults aplikasi Anda sekarang secara otomatis dikirim ke Watch Extension.
Menggunakan Data Inti
Jadi saya mengabaikan peringatan tentang Data Inti sebagai solusi yang lebih sulit dan mulai membaca. Dalam tiga jam saya berhasil. Saya meminta array tabel saya disimpan di Core Data dan memuat ulang data setelah membuka aplikasi kembali! Kode tutorialnya cukup mudah untuk diadaptasi dan saya bisa membuatnya menyimpan judul dan array detail hanya dengan sedikit eksperimen tambahan.
Jadi bagi siapa pun yang membaca posting ini yang berjuang dengan masalah tipe NSUserDefault atau yang kebutuhannya lebih dari menyimpan string, pertimbangkan menghabiskan satu atau dua jam bermain dengan data inti.
Inilah tutorial yang saya baca:
http://www.raywenderlich.com/85578/first-core-data-app-using-swift
Jika Anda tidak memeriksa "Data Inti"
Jika Anda tidak memeriksa "Data Inti" saat membuat aplikasi, Anda dapat menambahkannya setelah itu dan hanya membutuhkan waktu lima menit:
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
Cara Menghapus dari Daftar Data Inti
Hapus Data dari Coredata Swift
sumber
Oke, terima kasih kepada @bploat dan tautannya ke http://www.codingexplorer.com/nsuserdefaults-a-swift-introduction/
Saya telah menemukan bahwa jawabannya cukup sederhana untuk beberapa penyimpanan string dasar.
Saya telah meringkasnya di sini http://ridewing.se/blog/save-local-data-in-swift/
sumber
Menggunakan NSCoding dan NSKeyedArchiver adalah pilihan bagus lainnya untuk data yang terlalu rumit
NSUserDefaults
, tetapi untuk CoreData akan membutuhkan banyak. Ini juga memberi Anda kesempatan untuk mengelola struktur file secara lebih eksplisit, yang sangat bagus jika Anda ingin menggunakan enkripsi.sumber
Untuk Swift 4.0, ini menjadi lebih mudah:
sumber
Swift 3.0
Setter: Penyimpanan Lokal
Getter: Penyimpanan Lokal
sumber
Untuk Swift 3
sumber
Untuk seseorang yang tidak suka menangani UserDefaults karena beberapa alasan, ada opsi lain - NSKeyedArchiver & NSKeyedUnarchiver. Ini membantu menyimpan objek ke dalam file menggunakan pengarsipan, dan memuat file yang diarsipkan ke objek asli.
Saya telah menulis sebuah utilitas sederhana untuk menyimpan / memuat objek di penyimpanan lokal, menggunakan kode contoh di atas. Anda mungkin ingin melihat ini. https://github.com/DragonCherry/LocalStorage
sumber
Swift 5+
Tidak ada jawaban yang benar-benar membahas secara terperinci standar bawaan pada kemampuan penyimpanan lokal. Itu bisa melakukan jauh lebih dari sekadar string.
Anda memiliki opsi berikut langsung dari dokumentasi apple untuk mendapatkan data dari default.
Berikut adalah opsi untuk 'pengaturan'
Jika menyimpan hal-hal seperti preferensi dan bukan kumpulan data besar ini adalah opsi yang sangat baik.
Contoh ganda :
Pengaturan:
Mendapatkan:
Yang menarik dari salah satu getter adalah dictionaryRepresentation , pengambil berguna ini akan mengambil semua tipe data Anda apa pun mereka dan memasukkannya ke dalam kamus yang bagus yang dapat Anda akses dengan nama stringnya dan memberikan tipe data yang sesuai saat Anda meminta kembali karena itu tipe 'apa saja' .
Anda dapat menyimpan kelas dan objek Anda sendiri juga menggunakan
func set(Any?, forKey: String)
danfunc object(forKey: String) -> Any?
setter dan pengambil sesuai.Semoga ini menjelaskan lebih banyak kekuatan kelas UserDefaults untuk menyimpan data lokal.
Dengan catatan berapa banyak yang harus Anda simpan dan seberapa sering, Hardy_Germany memberikan jawaban yang bagus tentang hal itu pada posting ini , berikut adalah kutipan darinya
Hal lain yang perlu diperhatikan sebagaimana disebutkan oleh pengguna Mohammad Reza Farahani dari postingan ini adalah sifat asinkron dan sinkron dari userDefaults.
Misalnya, jika Anda menyimpan dan menutup program dengan cepat, Anda mungkin memperhatikan bahwa itu tidak menyimpan hasil, ini karena program itu tetap asinkron. Anda mungkin tidak memperhatikan hal ini setiap saat, jadi jika Anda berencana menabung sebelum keluar dari program, Anda mungkin ingin memperhitungkannya dengan memberikan waktu untuk menyelesaikannya.
Mungkin ada yang punya solusi bagus untuk ini yang bisa mereka bagikan di komentar?
sumber
NsUserDefaults hanya menyimpan ukuran variabel kecil. Jika Anda ingin menyimpan banyak objek, Anda dapat menggunakan CoreData sebagai solusi asli, atau saya membuat perpustakaan yang membantu Anda menyimpan objek semudah fungsi .save (). Ini didasarkan pada SQLite.
SundeedQLite
Lihatlah dan ceritakan komentar Anda
sumber