2012-03-20 12 views
9

Merhaba (altta asıl soru).Bir ana MOC aracılığıyla, bir çocuk yönetilen nesne bağlamındaki değişiklikleri diğerine nasıl birleştirirsiniz?

iOS 5'de, CoreData'da ana-çocuk yönetilen nesne bağlamlarının tanıtımı vardır.

Mağazada bir ana liste almak için birlikte çalışan bir standart NSFetchedResultsController ve UITableVeiwController var. getirilen sonuçlar kontrolörün yönetilen nesne bağlamı bir üst bağlamında bir çocuk olan:

// AppDelegate.m 

- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (__managedObjectContext != nil) 
    { 
     return __managedObjectContext; 
    } 

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

    // primary managed object context has NSPrivateQueueConcurrencyType 
    [__managedObjectContext setParentContext:[self primaryObjectContext]]; 
    return __managedObjectContext; 
} 

tablo görünümü denetleyicisi yeni bir kayıt eklemek için kalıcı bir görünüm denetleyicisi sunar fakat (bunu bu bağlamda ayrı yönetilen nesne bağlamı kullanır ebeveyn içeriğinin başka bir çocuğudur). Bu bağlam Tablo görünümü denetleyicisi bir temsilci callback'inde kurtulur:

- (void)addGame 
{ 
    // New child context 

    [self setBuildManagedObectContext:[[NSManagedObjectContext alloc] init]]; 
    [[self buildManagedObectContext] setParentContext:[[[self team] managedObjectContext] parentContext]]; 

    Team *buildTeam = (Team *)[[self buildManagedObectContext] objectWithID:[[self team] objectID]]; 
    Game *buildGame = [NSEntityDescription insertNewObjectForEntityForName:@"Game" 
               inManagedObjectContext:[self buildManagedObectContext]]; 


    [buildGame setTeam:buildTeam]; 

    BuildViewController *buildVC = [[BuildViewController alloc] initWithGame:buildGame delegate:self]; 
    UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:buildVC]; 
    [[self navigationController] presentViewController:navCon animated:YES completion:nil]; 
} 

#pragma mark - Build view controller delegate 

- (void)buildViewController:(BuildViewController *)controller didFinishWithSave:(BOOL)save 
{ 
    if (save) 
    { 
     NSError *error = nil; 
     if (![[self buildManagedObectContext] save:&error]) 
     { 
      NSLog(@"Error saving new game"); 
      abort(); 
     } 
    } 
    [self setBuildManagedObectContext:nil]; 
    [[self navigationController] dismissViewControllerAnimated:YES completion:nil]; 
} 

Soru:

ebeveyn-çocuk bağlamlarda ile, ana bağlamı onun çocuktan bildirim kurtarmak alacağı Benim anlayış

, ve sonra tüm çocuklarına bildir. Örneğimde, yapı bağlamı, getirilen sonuç denetleyicisini değişiklikleri birleştirmek için üst bağlamı tetiklemelidir.

Bu benim için gerçekleşmiyor, kayıtlar başarıyla oluşturuldu, ancak getirilen sonuç denetleyicisi onları almıyor. Eskiden, kayıt bildiriminden (CoreDataBooks'da görüldüğü gibi) kendi birleştirme işlemini uygulamak zorunda olduğunuzu biliyorum. Fakat çocuk-ebeveyn bağlamlarının bu sorunu çözdüğünü düşündüm. Çocuğu ve sonra ebeveyni kurtarmaya çalıştım ama fark yaratmıyor gibiydi. Birisi bunu bana açıklayabilir mi lütfen? (Not: Bu ayrı/arka plan iş parçacığı üzerinde bağlamlar değildir):

[child save:&error]; 
[parent performBlock:^{ 
    [parent save:&parentError]; 
}]; 
seni böyle kaydetmek gerektiğini söylüyor "Ne Çekirdek veri yenilikler" için WWDC 2011 sunumuna göre

Çok teşekkürler

cevap

14

Anlayışımdan bu, ebeveynin çocuk bağlamındaki değişiklikleri almasına ve birleştirmesine neden olur. Unutulmaması gereken bir şey, ebeveynin ve tüm çocukların aynı eşzamanlılık türüyle oluşturulması gerektiğidir.

- Ebeveynin çocuklarda değişiklik yaptığını değiştirdiği yanlış düzenleme düzeltildi, düzeltilmez.

+0

Teşekkürler, hala getirilen sonuç denetleyicisi ile ilgili sorunları ana üstündeki kaydetmeyi alıyorum. hmmm:/ – Cameron

+0

4 önemli FRC delege yöntemini doğru şekilde mi uyguluyorsunuz? Eğer öyleyse, FRC'nizi yürütmesini söyleyebilmeyi deneyebilirsiniz, ya yeniden getirin ya da imha edin ve yeniden oluşturun. FRC'lerin oluşturulması ve yok edilmesi nispeten ucuz bir işlemdir. Benzer bir meseleyi ele aldım ancak senaryoda, tahminimin zaman zaman değişmesi gerekiyordu. FRC'leri imha etmek ve yeniden yaratmak için sardım ve masamın verilerini yeniden yüklemesini söyledim. – afrederick

+0

Temsilci, yalnızca standart yöntemlerden biridir. Hala çalışmıyor, frc'yi bile yıkıyor. Farklı şeyler denemeye devam edecek. Yine de yardımı takdir ediyorum. – Cameron

İlgili konular