5

İki örneğim var NSManagedObjectContext: biri ana dişlide ve diğeri arka plan iş parçacığında kullanılır (NSOperation aracılığıyla.) İş parçacığı güvenliği için, bu iki bağlam yalnızca NSPersistentStoreCoordinator numaralı telefonu paylaşır.Paylaşılan kalıcı mağaza ile NSManagedObjectContexts arasında bekleyen değişiklikler kopyalanıyor mu?

Yapmakta olduğum sorun, ilk bağlamda (ana iş parçacığı üzerinde), -save gerçekleştirilinceye kadar ikinci bağlamda bulunmayan bekleyen değişikliklerle ilgilidir. Paylaşılan kalıcı mağazanın, -insertedObjects, -updatedObjects ve -deletedObjects tarafından izlenen NSManagedObjects kopyaları olmayacağı için bu anlaşılabilir bir durumdur.

Maalesef bu kullanıcı deneyimi ile ilgili bir sorun sunar: kaydedilmemiş değişiklikleri (zaman alıcı) arka plan iş parçacığı oluşturulan raporlarda görünmez. Aklıma

tek çözüm pis: İlk bağlamdan, eklenen güncellenir ve silinen nesneler almak ve ikinci bir bağlamda amacı, grafik üzerine bunları aşı. Veri kümesinde bazı oldukça karmaşık ilişkiler var, bu yüzden bu yönde gitmekte tereddüt ediyorum. Birisi burada daha iyi bir çözüm olarak umuyorum.

cevap

4

Bu, 10.7'nin altındaysa bazı çözümler vardır: bunlardan biri, ManagedObjectContexts'ı iç içe geçirebilmeniz, böylece değiştirilmekte olanı "kaydedebilmeniz" mümkün olacaktır ve bu, diske tüm yolu kaydetmeyecektir, ancak Ana içeriğin diğer çocuklarına sunulan değişiklikler.

10.7'den önce muhtemelen değişiklikleri kendiniz üstünüze kopyalamanız gerekecektir. Bu sadece süper bir şey değil çünkü sadece tek bir nesneyi NSManagedObjectContextObjectsDidChangeNotification dinleyebilir ve değişiklikleri tam olarak ana içerikten tekrar uygulayabilirsiniz. (Yaklaşık 20 satır kod olmalı.) Bu ikinci içeriği kaydetmem gerekmiyor mu? Eğer herhangi bir işletim sistemi kısıtlamaları var ama iOS 5/Mac OS 10.7 yuvalanmış yönetilen nesne bağlamları kullanmak Bunu gerçekleştirmek için eğer emin değil

+0

Teşekkürler Wil! 10'u hedeflemek isterim.6, her geçen gün daha da zorlaşıyor :-) - Değişiklik bildirimini takip ediyorum, ancak değişiklikleri nasıl uyguladığınızı ve varlık ilişkilerini nasıl sürdürdüğünüzden emin değilim. Biraz daha spesifik olabilir misiniz? – chockenberry

+0

Ah evet. Görünüşe göre benim modelime dayanan bir varsayım yapıyorum, ki bu da her nesnenin kendinize ait bir UUID (string) anahtarına sahip olmasıdır. –

+0

Arka planda MOC kaydedilmeden, ekler ana MOC'ye (yuvalanmış MOC'ler olmadan) görünmeyecektir. Değişiklik bildirimini (processPendingChanges öğesinden sonra verilir) dinler ve nesneleri kendiniz güncelleştirirseniz, var olan nesneler için güncelleştirmeler/silmeler çalışmalıdır. – diederikh

2

. Bir çocuk bağlamının, ebeveynte kaydedilmemiş değişiklikleri sadece yeni bir getirme yaparak çekebileceğine inanıyorum.

Düzenleme: Wil beni alt ama evet, önce iOS 5/Mac OS 10.7 Sizin NSManagedObjectContextDidSaveNotification dinlemek ve katma/güncellenen/silinmiş için userinfo sözlüğe bakmak gerekecek gibi görünüyor nesneler.

0

Alternatif bir çözüm, tek yönetilen nesne bağlamı kullanarak ilgili ve ona erişim üzerinde kendi iş parçacığı güvenliğini sağlayan veya bağlam en kilidini kullanmak ve yöntemlerini kilidini olabilir. Ben ana iş parçacığı yapmaya çalışacaktı

0

normal böylece ikinci bağlam sadece onun bağlam içine değişiklikleri birleştirebilirsiniz kaydetmek yok. Kullanım amaçlı bir API'lerin "mücadele edilmesi" asla iyi bir fikir değildir. Yeni kaydedilen kaydı bir öznitelikle ara işaret olarak işaretleyebilir ve kullanıcı son olarak düzenlemeyi iptal ederse daha sonra silebilirsiniz.

sizin işletmelerdeki özelliklere sahip olanlar sorunlarını çözme ve kolay olacağını esas bir eşleme ile arka plan iş parçacığı sorgulama ...

Ve bu yanı istikrarlı bir çözüm olacaktır. Veri tabanı tabanlı bir dünyadan (oracle) geliyorum, veriyi diğer DB oturumlarına (kakao uygulamasındaki dişlere eşit olacak şekilde) görünür/görünmez yapmak için genellikle bu tür kalıpları (kayıtlardaki durum nitelikleri) kullanırız. Her zaman sorunsuz çalışır. Diğer iş parçacığı/oturumları, yalnızca RDBMS'nin çoğu çalışma şeklindeki değişiklikleri yalnızca görmektedir.

İlgili konular