swift dispatch_once singleton modeli
Hızlı kullanım için uygun tek bir model üzerinde çalışmaya gayret ediyorum. Şimdiye kadar olmayan parçacığı güvenli bir model olarak çalıştırmayı başardım:
class var sharedInstance:TPScopeManager {
get {
struct Static {
static var instance : TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Statik yapı tek örneği sarma karmaşık adlandırma schemings olmadan tek örnekleri ile çarpışmak değil, ve şeyler oldukça özel yapmak gereken tek bir örneğini izin vermelisiniz. Açıkçası olsa da, bu modeli iş parçacığı güvenli değil, her şey için dispatch_once eklemeye çalıştım:
class var sharedInstance:TPScopeManager {
get {
struct Static {
static var instance : TPScopeManager? = nil
static var token : dispatch_once_t = 0
}
dispatch_once(Static.token) { Static.instance = TPScopeManager() }
return Static.instance!
}
}
Ama dispatch_once satırında derleyici bir hata alıyorum:
Cannot convert the expression's type 'Void' to type '()'
Sözdizimi birkaç farklı çeşit denedim, ama hepsi aynı sonuçları var gibi görünüyor
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
Kimseye dispatch_once
uygun kullanım hızlı kullanıyor biliyor musun? Ben başlangıçta düşünce sorun ile blok nedeniyle ()
hata mesajı, ama bakıyorum da bence olabilir bir madde elde dispatch_once_t
doğru tanımlanmış.
CEVAP
tl;dr: Kullanınsınıf sabiteğer Swift 1.2 veya üzeri kullanıyorsanız ve yaklaşımyapı iç içeeğer önceki sürümleri desteklemek isterseniz yaklaşım.
Swift ile benim deneyim tembel başlatma ve iş parçacığı güvenliği destekleyen Singleton deseni uygulamak için üç yaklaşım vardır.
Sınıf sabit
class Singleton {
static let sharedInstance = Singleton()
}
Bu yaklaşım Swift tembel sınıf sabitler ve Değişkenler) başlatır, çünkü tembel başlatma destekler ve let
tanım olarak, iş parçacığı güvenli değil.
Sınıf sabitleri Swift 1.2 tanıtıldı. Eğer Swift önceki bir sürümünü desteklemek isterseniz, ya da genel bir sabit altında iç içe geçmiş bir yapı yaklaşım kullanın.
Yapı iç içe
class Singleton {
class var sharedInstance: Singleton {
struct Static {
static let instance: Singleton = Singleton()
}
return Static.instance
}
}
Burada bir sınıf sürekli olarak iç içe geçmiş bir yapı statik sürekli kullanıyoruz. Bu statik sınıf sabitleri olmaması için geçici bir çözüm Swift 1.1 ve önceki ve hala statik sabitler eksikliği ve fonksiyonları değişkenleri için geçici bir çözüm olarak çalışır.
dispatch_once
Objective-C geleneksel yaklaşım Swift taşıdık. İç içe yapı yaklaşım üzerinde avantajı var oldukça eminim ama sözdizimi farklılıkları ilginç bulmak gibi zaten buraya koyuyorum.
class Singleton {
class var sharedInstance: Singleton {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: Singleton? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = Singleton()
}
return Static.instance!
}
}
Birim testleri için GitHub Bu proje bakın.
Neden Apple ARK altında singleton dese...
Böyle Büyük Mükafat 4, Çekirdek Veri M...
MVC, EF - DataContext singleton-Web-İs...
Kullanarak Swift ile isKindOfClass...
Kuvvetle Bağlı Modeli ile Radyo Düğmel...