2012-07-04 34 views
18

Şu anda bir arka plan alt iş parçacığı (ana UI iş parçacığı bağlamı olan) ve kaydetme yeni bir nesne oluştururken, NSFetchedResultsController iki yeni nesneyi göstermeye neden olan bir sorun yaşıyorum: biri geçici objectID ve biri diğeri kalıcı objectID. Bir şey kaçırmadığım sürece, bu bir çeşit hata gibi görünüyor.Ne zaman getPermanentIDsForObjects :?

Bu nedenle, oluşturduğum yeni nesneler için kalıcı kimlikler elde edeceğimi düşündüm. Bu, yinelenen satır sorununu giderir, ancak yeni rastgele hatalar sunar (örneğin, oluşturduğum yeni nesneye atıfta bulunarak "nesne için hatayı yerine getiremedi" gibi). Daha önce bahsedilenlerden herhangi birinin neden olduğuna dair herhangi bir fikri varsa, lütfen paylaşın.

Tahmin ediyorum obtainPermanentIDs doğru yönde bir adımdır. Ama bu yöntemi ne zaman ararım? Çocuk içeriğine kaydetmeden önce? Çocuğu ve sonra ebeveynini kurtardıktan sonra? Ebeveynten sonra mı? Ben backgroundMOC üzerinde yeni bir nesne oluşturmak Yani

masterMOC - private queue tied to the persistent store, so physical saves happen here 
----mainMOC - main queue tied to the UI, child of masterMOC 
-------backgroundMOC - private queue, child of mainMOC 

ve ben (ı kurtarmak aramak gerekecek demektir: Her üç bağlamlarda üzerine) diske kaydetmek immediatly niyetinde: Şu benim kurulum şudur, nerede obtainPermanentIDs'u çağırmalı mıyım?

(ya da herhangi kalıcı kimlikleri elde çağıran dışında farklı bir çözüm varsa hangi sorun bu yöntemi çağırmak için isteyeyim Neden neyse çözmek için tanıtıldı bu yöntem oldu??)

Güncelleme: bence Ne olduğunu çözmemeye rağmen ne olduğunu anladım (sadece bir teori olsa da). Çekirdek Veriler, fiziksel olarak diske kaydedildiğinde, nesneler için kalıcı kimlikler oluşturur. Yani benim durumumda, masterMOC üzerinde kaydetme çağrısı yapana kadar bu olmayacak. Şu anda backgroundMOC üzerinde yeni bir nesne oluştururken benim yaptığım:

  1. tasarruf backgroundMOC üzerinde (böylece değişiklikler mainMOC alarak bir seviye yukarı itilir ve benim tablo görünümünde yeni satırlar eklemek anlamına)
  2. tasarruf (nihayet diske kaydeder olan) masterMOC tasarruf
  3. (ı diske kaydetmek için hazırlanmak böylece) mainMOC üzerinde

burada oluyor backgroundMOC üzerinde tasarruf çağıran bir UI güncellemesi tetikler ve neden olmasıdır Hala sahip olan yeni bir nesne eklemek için sonuç denetleyicisini getirdi ly geçici bir kimlik. Ancak, masterMOC üzerinde kaydetme çağrısı, tüm nesnelerin kalıcı kimlikler atamasına neden olur; bu da başka bir kullanıcı arayüzü güncellemesine neden olur, bu "yeni" nesne için başka bir satır ekler! Son masterMOC kaydetmesini yorumlayarak, artık girişleri göremiyorum. Burada yanlış bir şey mi yapıyorum yoksa bu bir çeşit hata mı?

Başka bir güncelleştirme: Sanırım hatayı çok doğruladım. BackgroundMOC üzerinde kaydetmeyi çağırın ve daha sonra mainMOC ve masterMOC 5 saniye sonra kaydetmek için bir zamanlayıcı ayarlayın. Immediatley, backgroundMOC'ye kaydedildikten sonra, masama yeni bir satır eklenir. 5 saniye sonra (ana ve ana kaydedildikten sonra), başka bir yeni satır eklenir. (eklenen satırın bir temp kimliği vardır ve en yeni eklenti kalıcı bir kimliğe sahiptir).

cevap

11

Tam olarak aynı sorunu yaşadım. Tabii ki, özellikle de zor ve dağınık bir günün ardından her şeyin hata ayıklamasıyla ilgili sorunun geçici bir kimlik olduğunu öğrendik.:)

Sizinle aynı yapıya sahibim ve ayrıca arka planda ve ana bağlamlarda kaydetmeyi beklediğim davranışları kodlamak için NSManagedObjectContext alt sınıflarına sahibim. (ve ana bağlam, dış hizmetle değiştirilen, ancak iki alt sınıfa neden sahip olduğumun bir açıklaması olarak bahsetmeye değen herhangi bir nesneyi eşleştirmeli) ve ana bağlamdaki bir kaydetme ana içeriği kaydetmelidir. Ben [super save:] aramaya - save: uygulamak (sizin backgroundMOC eşdeğeri) Benim RFSImportContext alt sınıfta

ardından [self.parentContext performBlock:] blok bağlam ana içeriği ile obtainPermanentIDsForObjects: çağıran C (burada self.parentContext sizin mainM eşdeğerdir) çağırmak - updatedObjects ve - insertedObjects dizileri, sonra ana içeriği kaydediyorum. açıkladığınız olarak

artık benim NSFetchedResultsController içine geçici nesnelerin sızıntı var. Bu durumu iyileştirmenin bir yolu, kalıcı nesne kimliklerini elde etmek, kendini kaydetmek ve daha sonra ana içeriği kaydetmek için RFSMainContext alt sınıfını (yine, anaMOC'unuza eşdeğer) kullanmaktır. - save:. Bu, her zaman ana bağlamın, kaydedildiği zaman içindeki nesneler için kalıcı kimliklere sahip olmasını istediğimiz davranışı kodlar.

+2

yorumunuz nedense bana yardımcı oldu ama başka bir şekilde. NSFetchedresultscontroller kullanıyordum ve geçici ve kalıcı oluyordu. Yani her zaman denetleyici didchangecontent çağırır bir getPermanentIDsForObjects: tüm getirilen nesneler için ve şimdi mükemmel çalışıyor! –

+0

@ JoãoNunes hala benim için çalışmıyor, kimliğim zaten kalıcı ve bu hata hala devam ediyor –

+0

Ne tür bir hata var? –

İlgili konular