SORU
26 Ocak 2010, Salı


Çekirdek Veri parçacığı uygulama multi

Çoklu iş parçacığı bir şekilde temel verileri kullanmaya çalışıyorum. Ben sadece arka planda yeni bir veri indirirken daha önce indirilmiş olan uygulama göstermek istiyorum. Bu kullanıcı uygulamaya erişmek güncelleme işlemi sırasında izin vermeli.

Ben bir NSURLConnection hangi indirme dosyasını kullanarak asyncronously temsilci (ilerleme gösteren), o zaman kullandığım bir XMLParser için ayrıştırma yeni veri ve yeni oluştur NSManagedObjects ayrı bir bağlam, kendi persistentStore ve kullanarak ayrı bir konu.

Sorun olabilir gösterirken eskisinin aynı bağlamda yeni nesneler oluşturma BAD_İNSTRUCTİON istisna atar. Bu yüzden, yeni veriler için ayrı bir bağlamda kullanmaya karar verdim, ama diğer içerik için tüm nesneleri taşımak için bir yol bittiğinde çözemiyorum.

Paolo aka SlowTree

CEVAP
5 AĞUSTOS 2012, Pazar


Şu anda [Mayıs 2015] Apple Concurrency with Core Data documentation, en iyi ihtimalle, çok yanıltıcı gibi değil kapak herhangi yenilikleri içinde iOS 5 ve dolayısıyla artık gösterir en iyi yolları kullanın çekirdek aynı veri. İOS 5 - üst bağlam ve yeni eşzamanlılık/diş türleri içinde çok önemli iki değişiklik var.

Henüz kapsamlı bir şekilde bu yeni özellikleri kapsayan herhangi bir yazılı belge bulamadım, ama WWDC 2012 video "Session 214 - Core Data Best Practices" Her şey çok iyi açıklıyor.

Magical Record Bu yeni özellikler kullanır ve bir göz değer olabilir.

Gerçek temelleri hala aynı hala sadece yönetilen nesneleri yönetilen nesne bağlamı oluşturuldu iplik kullanabilirsiniz.

Şimdi [moc performBlock:] sağ konu üzerinde kod çalıştırmak için kullanabilirsiniz.

MergeChangesFromContextDidSaveNotification kullanmaya gerek yok artık, onun yerine değişiklikleri yapın, alt bağlam kaydedin çocuk bir bağlam oluşturmak. Çocuk kapsamında tasarruf değişiklikleri otomatik olarak üst bağlam içine itecektir, ve disk için değişiklikleri kaydetmek için bu konuyu üst bağlamda tasarruf sadece gerçekleştirmek.

Bunun için eşzamanlı bir tür üst bağlamda, örneğin oluşturmanız gerekir:

mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

Sonra arka plan iş parçacığı:

context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[context setParentContext:mainManagedObjectContext];

<... perform actions on context ...>

NSError *error;
if (![context save:&error])
{
    <... handle error ...>
}
[mainManagedObjectContext performBlock:^{
    NSError *e = nil;
    if (![mainContext save:&e])
    {
        <... handle error ...>
    }
}];

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Atlantic Records

    Atlantic Rec

    15 Aralık 2006
  • Pocketnow

    Pocketnow

    14 EKİM 2007
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006