SORU
3 HAZİRAN 2014, Salı


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
10 HAZİRAN 2014, Salı


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Leigh Momii

    Leigh Momii

    10 Mayıs 2006
  • NewsyTech

    NewsyTech

    2 AĞUSTOS 2010
  • The Pet Collective

    The Pet Coll

    5 Ocak 2012