2011-01-20 19 views
8

UITableView'ım için KVO'yu uygulamak için bir NSFetchedResultsController kullanıyorum (ki bu barizdir). Anlayamadığım şey, birden fazla Varlığın nasıl kullanılacağıdır - bir ağaç yapısının türü - aynı anda (ed) bulunacak.NSFetchedResultsController - KVO, UITableView ve bir "Tree"

  • ENTITY1
    • DisplayName
    • RelationToEntity2
  • ENTITY2
    • DisplayName
  • : Burada

    benim kurulduğundan

Şimdi sunulacak verileri elde edebilirim - şimdiye kadar çok iyi. İstediğim aşağıdaki yapıya sahip (düzleştirilmiş bir görünümü gibi) tek kesitli TableView sahip olmaktır:

  • ENTITY1 (Giriş 1)
  • ENTITY2 (Giriş 1)
  • ENTITY2 (Giriş 2)
  • ...
  • ENTITY1 (Giriş 2)
  • ...

o bir şey gibi görünebilir rağmen bölümler üzerinden yapılmalı, değil. Her iki Varlık da bir UITableViewCells olmalıdır. Birisi gerçek hiyerarşiyi kaybetmeden düzleştirmek için bana doğru yönü gösterebilir.

+0

Doğrudan bir NSFetchedResultsController ile yapabileceğinize inanmıyorum; Bir ara model oluşturmak zorunda olacaksınız, bunların özellikleri nihai tablo görünümünde kaç öğeye sahip olduğunuza bağlı olacaktır. Ayrıca, örneğinizden, ağaç yapınızdan düzleştirilmiş görünümünüze nasıl geçtiğinizden net değil - lütfen daha eksiksiz bir şey sağlayabilir misiniz? – hatfinch

+0

Asıl sorun, düzleştirilmiş yapıyı ağaçtan nasıl alıyorum. Tableview'im kaç tane öğe olacağını bilmez - hepsi NSFetchedResultsController tarafından yapılır. Ara model oluşturabilirim, ama gerçekten yapmak istemediğim şey bu. – gamma

cevap

1

Kendi "düzleştirilmiş" veri kaynağınızı korumanız gerektiği gibi geliyor. Belki şu çalışacaktır:

NSFetchedResultController yeni Entity1 takıldıktan size söyler zaman, _flattenedArray yüzden şöyle, diyelim içine Entity1 ve ilişkili Entity2 s ekleyin:

[<Entity1>, <related Entity2>, <related Entity2>...]

seni bir SubArray yeniiçeren inşa

  1. : - onları size kalmış eklemek oldukça fazla aşağı gelir 0 ve Entity2 nesneleri
  2. , _flattenedArray'un yeni alt dizgiyi nereye ekleyeceğine karar verir.
  3. çağrı reloadData veya başka araçlar, bir Entity1 nesne kaldırıldığında yeni veri

ait tableView bilgilendirmek başka Entity1 nesnesine sen _flattenedArray sonuna karşılaşmak kadar ve sonraki tüm Entity2 nesneleri kaldırmak veya çalıştırmak için . Bu, Entity2'un asla bir "üst düzey" nesne olmadığını varsayar. Eğer varsa, ilişkideki sadece Entity2 nesnesini kaldırmanız gerekecektir.Bir Entity1 nesne kazanç veya Entity2 nesneyi kaybettiğinde

, önce o yeniden takmayı _flattenedArray den Entity1 nesneyi silebilir. Bu çok verimli ise, yerine birleştirme yapın.

+0

Bu mantıklı geliyor ve düşündüğüm şeylerden biri. Bellek izi ne olacak? Hafızamda her zaman çift veri alacağım, değil mi? Bununla ilgili bir çözüm, yalnızca Varlıklar çıplak gövdesini almak olabilir. – gamma

+0

Yapmayacaksınız - NSArray, nesnelerin kopyalarını değil, nesnelere başvuruları saklar. CoreData'dan geliyorlarsa, bunlar NSManagedObjects'tir, yani onların özniteliklerine erişinceye kadar bellekte bile olmayabilirler ya da belleğe zarar veren başka bir işlem olabilirler. – freespace

+0

Ben bu şekilde yaptım ve iyi çalışıyor gibi görünüyor. Caveat, KVO'nun verileri güncellediği ve henüz mükemmel bir şekilde tamamlanmadığı zaman, düz listeyi yeniden doldurmak zorunda kalacağım. – gamma

0

Bu, varlık mirasını kullanmak için tam olarak durumdur. Getirilmiş bir sonuç denetleyicisine sahip bir ana nesnenin getirilmesi sırasında, tüm alt öğeler tablo tarafından görüntülenebilir. Bölümleri tercih ettiğiniz sırada görüntülemek için bölüm sırası özelliğini kullanın. Ve bölümler içinde sipariş vermek için ikinci bir sıralama özelliğini kullanın. Notlar uygulaması, soyut bir Kapsayıcı varlık getirerek bunu yapar ve çocuk varlıkları olan Hesaplar ve Klasörler'i görüntüler. Bu, Hesap ve "Tüm iCloud" hücresinin ilk klasörü aslında bir Hesaptır. Klasörler, varlık kalıtım ağacında eşit olsalar bile bir hesapla ilişki kurabilir.