2014-09-21 23 views
19

Swift'de Temel Verileri kullanırken hesaplanan özniteliklerin uygulanmasıyla ilgili herhangi bir öneri var mı? oluşturulan ManagedObject sınıfı ile CoreData Hızlı ve geçici özellik alıcıları

, ben getter geçersiz kılmak için çalıştı ama ben hatayı alıyorum: Bir geçici (hesaplanan) özellik için getter geçersiz kılamaz ima

'NSManaged' not allowed on computed properties

.

Aşağıdaki kod örneğinde, modelimde geçici bir öznitelik olarak dateDue tanımlanmıştır.

Lütfen @NSManaged satırlarının Xcode tarafından oluşturulduğunu unutmayın - bana eklenmedi.

@NSManaged var timeStamp: NSDate 
@NSManaged var dateDue: String { 
    get { 

     self.willAccessValueForKey("dateDue") 
     var ddtmp = self.primitiveValueForKey("dateDue") as String? 
     self.didAccessValueForKey("dateDue") 

     if (ddtmp == nil) 
     { 

      let calendar = NSCalendar.currentCalendar() 

      let components = calendar.components((NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit) , fromDate: self.timeStamp) 
      ddtmp = "\(components.year * 1000 + components.month)" 
      self.setPrimitiveValue(ddtmp, forKey: "dateDue") 

     } 



     return ddtmp! 
    } 

} 

cevap

5

"Geçici" ve "hesaplanan" demek istediğiniz anlamda farklı şeylerdir ve birbirini dışlar.

Geçici, değerin nesne grafiğinde bellekte saklandığı anlamına gelir. Hesaplanan, değerin hiçbir yerde saklanmadığı ve alıcıda hesaplandığı anlamına gelir. Her ikisi de, nesne grafiğinde saklanan ve diske kaydedilmiş olan geçici olmayan özniteliği özniteliğinden farklıdır. Yönetilen nesne modelinizde yalnızca bir yuvaya sahip olan özniteliklere uygulanabilir.

.

+0

Yönetilen nesne modelindeki bir özniteliktir. Genişletmek için, elma örnek programlarından biri tarafından kullanılan bir tekniği kopyalamaya çalışıyorum - ancak elma örneği Objectcode C - aslında Xcode (ana detay uygulama) teslim şablonunda yazılmıştır. –

+0

Evet ama ObjC, 'NSManaged' işlevini yerine getirmiyor - eğer altta yatan özelliği sarmaya çalışıyorsanız, burada @ NSManaged' kullanmamalısınız. '@ NSManaged' derleyiciye, mülkiyet uygulamasının çalışma zamanında geç sağlandığını söyler. Uygulamayı açıkça sağlarken '@ NSManaged' kullanımı bir çelişkidir. – iluvcapra

+0

Tamam teşekkürler. NSManaged öğesini kaldırmayı tekrar edeceğim. Nasıl yapılacağını anladım :) –

1

NSManaged özniteliğini kaldırın.

+0

Hayır. Üzgünüm, bu o değil. Kodun bu kısmı Xcode tarafından üretilmiştir, bu yüzden doğru olduğunu (ya da en azından elma amaçlı) varsaydığını varsayalım. –

+1

kabul etmez;) geçici ise, yönetilmez. Bu nedenle ya geçerli ya da bir hata yaptınız –

+0

Xcode kodu oluşturdu ama temel niteliği gizleyen bir yöntem yazıyorsunuz, siz ve kod üreteci farklı şeyler düşünüyorsunuz. – iluvcapra

44

İlk olarak, veri modelinde bir geçici öznitelik oluşturun (section). Geçici olduğu için fiziksel olarak depolanmaz ve yönetilen nesne bağlamında saklanmaz.

section nitelik burada gösterilir:

enter image description here

varlık burada gösterilir:

enter image description here

sınıf NSManagedObject alt sınıf

'bölümünde' özelliğini bilgisayarlı gerekirdi. Bunu gerçekleştirmek için nasıl gösteren NSManagedObject alt sınıf burada gösterilir:

class Number: NSManagedObject { 

    @NSManaged var number: NSNumber 

    var section: String? { 
     return number.intValue >= 60 ? "Pass" : "Fail" 
    } 
} 

Sonra istenirse veri modelinde geçici özellikte temel ve önbellek adı olmaya NSFetchedResultsController in başlatıcısı sectionForKeyPath ayarlamalısınız.

override func viewDidLoad() { 
     super.viewDidLoad() 

     fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: "section", cacheName: "Root") 
     fetchedResultsController?.delegate = self 
     fetchedResultsController?.performFetch(nil) 

     tableView.reloadData() 
} 

func fetchRequest() -> NSFetchRequest { 

    var fetchRequest = NSFetchRequest(entityName: "Number") 
    let sortDescriptor = NSSortDescriptor(key: "number", ascending: false) 

    fetchRequest.predicate = nil 
    fetchRequest.sortDescriptors = [sortDescriptor] 
    fetchRequest.fetchBatchSize = 20 

    return fetchRequest 
} 

sonuç pass sıralanmış veya dinamik olarak başarısız notları ile UITableViewController geçerli:

enter image description here

Ben GitHub bulunabilir örnek bir proje yaptı.

+0

https://gist.github.com/ivangodfather/86e0c3a02644f3520955 – Godfather

+1

Benim için çalıştı. :) Bu çözümün kötü tarafı, otomatik oluşturulan Core Data sınıfını düzenlemeniz gerektiğidir. Her yenilendiğinde, değişiklikleri yeniden yapmanız gerekir. Bölümü bir uzantı sınıfına koydum, ancak sınıfı yeniden oluşturduktan sonra oluşturulmuş sınıfa ait bölümü kaldırmam gerekiyor. –

+1

Bu cevap kabul edilmelidir! Numaralar yerine tarihlerle benim için mükemmel çalıştı. "DateSectionTitles" Apple örnek projesinden başlayarak bölüm ayırmayı uygulamaya çalışan herkes için bir öneri: bunun yerine bu cevabı takip edin! Çok teşekkürler @Bluehound – cdf1982