2016-04-04 28 views
4

Bir Uygulamada Realm kullanıyorum ve gelecekte çok fazla değişiklik yapmadan veritabanı sağlayıcılarını takas edebilmem için mümkün olduğunca çok soyutlamaya çalışıyorum.Realm kalıcılığı için tasarım deseni

Aşağıdakiler konusunda endişe duymamıza rağmen, bu desen iyi çalıştı.

  • Yeni bir realm nesnesini her yüklendiğinde bir ek yük oluşturuyor (Şu andaki Anlayışım Nesnelerin dahili olarak önbelleğe alındığı durumudur)?
  • Realm kullanmayla ilgili herhangi bir sorun var mı?
  • Amacım için daha iyi tasarım desenleri var mı? Tamamen katı tasarım deseni var

    public struct BookDataLayer: BookDataLayerProvider { 
    
    func isBookAvailable(bookIdentifier: String) throws -> Bool { 
        let database = try getDatabase() 
        return !database.objects(Book).filter("identifier = %@", bookIdentifier).isEmpty 
    } 
    
    func createOrUpdateBook(bookIdentifier: String, sortIndex: Int) throws { 
        let book = Book() 
        Book.bookIdentifier = bookIdentifier 
        Book.sortIndex = sortIndex 
        try create(book, update: true) 
    }} 
    
    protocol BookDataLayerProvider : DataAccessLayer { 
        func isBookAvailable(bookIdentifier: String) throws -> Bool 
        func createOrUpdateBook(bookIdentifier: String, sortIndex: Int) throws n} 
    
        extension DataAccessLayer { 
    
    func getDatabase() throws -> Realm { 
        do { 
         let realm = try Realm() 
         // Advance the transaction to the most recent state 
         realm.refresh() 
         return realm 
        } catch { 
         throw DataAccessError.DatastoreConnectionError 
        } 
    } 
    
    func create(object: Object, update: Bool = false) throws { 
        let database = try self.getDatabase() 
    
        do { 
         database.beginWrite() 
         database.add(object, update: update) 
         // Commit the write transaction 
         // to make this data available to other threads 
         try database.commitWrite() 
        } catch { 
         throw DataAccessError.InsertError 
        } 
    }} 
    
    // Usage 
    let bookDataLayer = BookDataLayer() 
    bookDataLayer.isBookAvailable("4557788") 
    
    bookDataLayer.createOrUpdateBook("45578899", 10) 
    

cevap

3

. Geliştiriciler için veri katmanı API'lerini kodlarından çıkarmaları gerektiğinde bunları kodlamalarını sağlamak oldukça yaygındır. Sorularınıza yanıt olarak

:

  • Doğru konum. Realm nesne örnekleri dahili olarak önbelleğe alınır, böylece let realm = try! Realm()'u çok az miktarda genel giderle kolayca arayabilirsiniz.
  • Belirli bir neden bulamadıkça, Realm örneğinde kullandığınız her seferde refresh() numaralı telefonu çağırmanız gerekmeyebilir. Ana iş parçasındaki bölge örnekleri, çalışma döngüsünün her yinelemesinde otomatik olarak yenilenir, böylece arka plan iş parçacığındaki değişiklikleri beklediğinizde veya geçerli çalışma döngüsü tamamlanmadan önce değişikliklere erişmeniz gerektiğinde, yalnızca refresh() numaralı telefonu aramanız gerekir.
  • 'Better' tasarım kalıpları büyük olasılıkla bir fikir meselesidir, fakat diğer kod tabanlarından gördüğüm kadarıyla, orada sahip olduğunuz şey zaten harika! :)
+0

Bana cevap vermek için zaman ayırdığınız için çok teşekkür ederim. Ben burayı çok seviyorum. Cevaplarınız gerçekten yardımcı oluyor. – Jani

+0

Benim için zevk! Cevaplarımı faydalı bulduğuna sevindim! Tanrı alemden zevk aldığını duymak! Bu konuda daha fazla soru sormaktan çekinmeyin! :) – TiM

İlgili konular