Bu soru her zaman ortaya çıkıyor.
Bir öneri, bir veri taşıyıcı tekli oluşturmaktır: Uygulamanızın ömrü boyunca bir kez ve yalnızca bir kez oluşturulan ve uygulamanızın ömrü boyunca varlığını sürdüren bir nesne.
Bu yaklaşım, uygulamanızdaki farklı sınıflarda kullanılabilir / değiştirilebilir olması gereken global uygulama verileriniz olduğu durumlar için çok uygundur.
Görünüm denetleyicileri arasında tek yönlü veya 2 yönlü bağlantılar kurma gibi diğer yaklaşımlar, bilgileri / mesajları doğrudan görünüm denetleyicileri arasında ilettiğiniz durumlar için daha uygundur.
(Diğer alternatifler için aşağıdaki nhgrif'in cevabına bakın.)
Bir veri kapsayıcısı tekliyle, sınıfınıza tekliğinize bir başvuru depolayan bir özellik eklersiniz ve daha sonra bu özelliği, erişime ihtiyacınız olduğunda kullanırsınız.
Singleton'ınızı, içeriğini diske kaydedecek şekilde ayarlayabilirsiniz, böylece uygulama durumunuz başlatmalar arasında devam eder.
GitHub'da bunu nasıl yapabileceğinizi gösteren bir demo proje oluşturdum. Bağlantı burada:
SwiftDataContainerSingleton projesi GitHub'da
İşte o projedeki README:
SwiftDataContainerSingleton
Uygulama durumunu kaydetmek ve nesneler arasında paylaşmak için bir veri kabı tekli kullanmanın bir gösterimi.
DataContainerSingletonSınıf fiili tekil olduğunu.
sharedDataContainerSingleton'a bir referans kaydetmek için statik bir sabit kullanır .
Singleton'a erişmek için sözdizimini kullanın
DataContainerSingleton.sharedDataContainer
Örnek proje, veri kabındaki 3 özelliği tanımlar:
var someString: String?
var someOtherString: String?
var someInt: Int?
someIntMülkü veri kabından yüklemek için aşağıdaki gibi bir kod kullanırsınız:
let theInt = DataContainerSingleton.sharedDataContainer.someInt
BazıInt'e bir değer kaydetmek için sözdizimini kullanırsınız:
DataContainerSingleton.sharedDataContainer.someInt = 3
DataContainerSingleton inityöntemi UIApplicationDidEnterBackgroundNotification,. Bu kod şuna benzer:
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()
}
Gözlemci kodunda, veri kabının özelliklerini içine kaydeder NSUserDefaults. NSCodingDurum verilerini kaydetmek için Core Data veya diğer çeşitli yöntemleri de kullanabilirsiniz .
DataContainerSingleton inityöntemi ayrıca özellikleri için kaydedilmiş değerleri yüklemeye çalışır.
İnit yönteminin bu kısmı şuna benzer:
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?
Değerleri NSUserDefaults'a yüklemek ve kaydetmek için anahtarlar DefaultsKeys, aşağıdaki gibi tanımlanan bir yapının parçası olan dize sabitleri olarak saklanır :
struct DefaultsKeys
{
static let someString = "someString"
static let someOtherString = "someOtherString"
static let someInt = "someInt"
}
Bu sabitlerden birine şöyle referansta bulunuyorsunuz:
DefaultsKeys.someInt
Veri taşıyıcı tekli kullanarak:
Bu örnek uygulama, veri kabının tek değerlikli kullanımını sağlar.
İki görünüm denetleyicisi vardır. İlki, UIViewController'ın özel bir alt sınıfı ViewController, ikincisi ise UIViewController'ın özel bir alt sınıfıdır SecondVC.
Her iki görünüm denetleyicisinin de üzerinde bir metin alanı vardır ve her ikisi de veri kabı singlelton someIntözelliğinden kendi viewWillAppearyöntemlerinde metin alanına bir değer yükler ve her ikisi de metin alanından geçerli değeri veri kabının `` someInt '' içine geri kaydeder.
Değeri metin alanına yükleyen kod şu viewWillAppear:yöntemdedir:
override func viewWillAppear(animated: Bool)
{
let value = DataContainerSingleton.sharedDataContainer.someInt ?? 0
textField.text = "\(value)"
}
Kullanıcı tarafından düzenlenen değeri veri taşıyıcısına geri kaydetme kodu, görünüm denetleyicilerinin textFieldShouldEndEditingyöntemlerindedir:
func textFieldShouldEndEditing(textField: UITextField) -> Bool
{
DataContainerSingleton.sharedDataContainer.someInt = textField.text!.toInt()
return true
}
Görünüm denetleyicisi her görüntülendiğinde kullanıcı arabiriminizin güncellenmesi için viewDidLoad yerine viewWillAppear'da kullanıcı arabiriminize değerler yüklemelisiniz.