Pertanyaan ini selalu muncul setiap saat.
Salah satu sarannya adalah membuat penampung data tunggal: Objek yang dibuat sekali dan hanya sekali dalam kehidupan aplikasi Anda, dan terus berlanjut selama masa aktif aplikasi Anda.
Pendekatan ini sangat sesuai untuk situasi ketika Anda memiliki data aplikasi global yang perlu tersedia / dapat dimodifikasi di berbagai kelas dalam aplikasi Anda.
Pendekatan lain seperti menyiapkan tautan satu arah atau 2 arah antara pengontrol tampilan lebih cocok untuk situasi di mana Anda menyampaikan informasi / pesan secara langsung antara pengontrol tampilan.
(Lihat jawaban nhgrif, di bawah, untuk alternatif lain.)
Dengan penampung data tunggal, Anda menambahkan properti ke kelas Anda yang menyimpan referensi ke tunggal Anda, lalu menggunakan properti itu kapan pun Anda membutuhkan akses.
Anda bisa mengatur singleton Anda sehingga ia menyimpan isinya ke disk sehingga status aplikasi Anda tetap ada di antara peluncuran.
Saya membuat proyek demo di GitHub yang mendemonstrasikan bagaimana Anda dapat melakukan ini. Ini tautannya:
Proyek SwiftDataContainerSingleton di GitHub
Berikut adalah README dari proyek itu:
SwiftDataContainerSingleton
Demonstrasi menggunakan wadah data tunggal untuk menyimpan status aplikasi dan membagikannya di antara objek.
The DataContainerSingletonkelas adalah tunggal yang sebenarnya.
Ini menggunakan konstanta statis sharedDataContaineruntuk menyimpan referensi ke singleton.
Untuk mengakses singleton, gunakan sintaks
DataContainerSingleton.sharedDataContainer
Proyek sampel mendefinisikan 3 properti dalam penampung data:
var someString: String?
var someOtherString: String?
var someInt: Int?
Untuk memuat someIntproperti dari penampung data, Anda akan menggunakan kode seperti ini:
let theInt = DataContainerSingleton.sharedDataContainer.someInt
Untuk menyimpan nilai ke someInt, Anda akan menggunakan sintaks:
DataContainerSingleton.sharedDataContainer.someInt = 3
Metode DataContainerSingleton initmenambahkan pengamat untuk UIApplicationDidEnterBackgroundNotification. Kode itu terlihat seperti ini:
goToBackgroundObserver = NSNotificationCenter.defaultCenter().addObserverForName(
UIApplicationDidEnterBackgroundNotification,
object: nil,
queue: nil)
{
(note: NSNotification!) -> Void in
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject( self.someString, forKey: DefaultsKeys.someString)
defaults.setObject( self.someOtherString, forKey: DefaultsKeys.someOtherString)
defaults.setObject( self.someInt, forKey: DefaultsKeys.someInt)
defaults.synchronize()
}
Dalam kode pengamat itu menyimpan properti penampung data ke NSUserDefaults. Anda juga dapat menggunakan NSCodingCore Data, atau berbagai metode lain untuk menyimpan data status.
Metode DataContainerSingleton initjuga mencoba memuat nilai yang disimpan untuk propertinya.
Bagian dari metode init tersebut terlihat seperti ini:
let defaults = NSUserDefaults.standardUserDefaults()
someString = defaults.objectForKey(DefaultsKeys.someString) as! String?
someOtherString = defaults.objectForKey(DefaultsKeys.someOtherString) as! String?
someInt = defaults.objectForKey(DefaultsKeys.someInt) as! Int?
Kunci untuk memuat dan menyimpan nilai ke NSUserDefaults disimpan sebagai konstanta string yang merupakan bagian dari sebuah struct DefaultsKeys, didefinisikan seperti ini:
struct DefaultsKeys
{
static let someString = "someString"
static let someOtherString = "someOtherString"
static let someInt = "someInt"
}
Anda mereferensikan salah satu konstanta ini seperti ini:
DefaultsKeys.someInt
Menggunakan wadah data tunggal:
Aplikasi sampel ini membuat penggunaan penampung data tunggal secara trival.
Ada dua pengontrol tampilan. Yang pertama adalah subkelas khusus UIViewController ViewController, dan yang kedua adalah subkelas khusus UIViewController SecondVC.
Kedua pengontrol tampilan memiliki bidang teks di atasnya, dan keduanya memuat nilai dari properti penampung data singlelton someIntke bidang teks dalam viewWillAppearmetode mereka , dan keduanya menyimpan nilai saat ini dari bidang teks kembali ke `someInt 'penampung data.
Kode untuk memuat nilai ke dalam bidang teks ada di viewWillAppear:metode:
override func viewWillAppear(animated: Bool)
{
let value = DataContainerSingleton.sharedDataContainer.someInt ?? 0
textField.text = "\(value)"
}
Kode untuk menyimpan nilai yang diedit pengguna kembali ke penampung data ada di textFieldShouldEndEditingmetode pengontrol tampilan :
func textFieldShouldEndEditing(textField: UITextField) -> Bool
{
DataContainerSingleton.sharedDataContainer.someInt = textField.text!.toInt()
return true
}
Anda harus memuat nilai ke antarmuka pengguna Anda di viewWillAppear daripada viewDidLoad sehingga UI Anda diperbarui setiap kali pengontrol tampilan ditampilkan.