2012-01-20 23 views
6

Temel veri mantığımı RKManagedObjectStore'a taşıdığımdan beri ciddi sorunlarım var. I kurulum görünümü denetleyicisi ana parçacığı içinde [NSManagedObject managedObjectContext] ayarlanmış bağlamda bir NSFetchedResultsController:Restkit [NSManagedObject managedObjectContext] farklı örnekleri döndürür

assert([NSThread isMainThread]); 
NSManagedObjectContext* context = [NSManagedObject managedObjectContext]; 
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:[Item fetchRequest] managedObjectContext:context sectionNameKeyPath:nil cacheName:@"Master"]; 

Bu bağlamda gibi maddeler yerleştirmeye:

Item* item = [Item object]; 
item.name = @"Foo"; 
[[RKObjectManager sharedManager].objectStore save]; 

Ancak getirilen sonuçlar kontrol değişikliklerden haberdar edilmez. Böylece elle bildirim kayıtlı: RKManagedObjectStore farklı bağlamlarda genelinde değişiklikleri birleştirir beri

[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) { 
    NSLog(@"Context changed"); 

    [self.fetchedResultsController performFetch:nil]; 
    [self.tableView reloadData]; 
}]; 

Bu

gerçekten, sanırım gerekli olmamalıdır. İkincisi, Öğe nesneyi silmek için ben Bu nesne başka kapsamında silinemez belirten bir hata üretti

[item deleteEntity]; 

çalıştı. Bu kesinlikle doğru, ama NEDEN cehennem Ana Konu için aynı örnek değil mi? Sadece varlık tr silmeden önce görünümü Kontrolörün içinde ayrıca aşağıdaki çağrı:

assert([NSThread isMainThread]); 
NSManagedObjectContext* sameContext1 = [NSManagedObject managedObjectContext]; 
NSManagedObjectContext* sameContext2 = self.fetchedResultsController.managedObjectContext; 
assert(sameContext1 == sameContext2); //FAILS 

[NSManagedObject managedObjectContext] kullanılırken denir RKManagedObjectStore en managedObjectContext alıcı Uygulama baktığımızda, iplik başına aynı örneği döndürülmelidir:

-(NSManagedObjectContext*)managedObjectContext { 
    NSMutableDictionary* threadDictionary = [[NSThread currentThread] threadDictionary]; 
    NSManagedObjectContext* backgroundThreadContext = [threadDictionary objectForKey:RKManagedObjectStoreThreadDictionaryContextKey]; 
    ... 
} 

cevap

9

Sonunda, hata ayıklama saatlerinden sonra bu kötü hatayı izledim. Sorun, RKObjectManager'un RKManagedObjectStore referansına sahip olmasıdır. Fakat bir şekilde ARC'yi kullanırken bu referans [RKObjectManager sharedManager] örneğinde saklanmamakta ve dağıtılmaktadır. Bu, iplik yerel önbelleğinin yıkanmasına neden olur. Bu nedenle yönetilen nesne bağlamı birleştirme çalışmaz, çünkü her erişimde yeni bir yönetilen bağlam yaratılır. Düzeltme kolaydır. App Delegate'inizde RKManagedObjectStore'a güçlü bir referans tutun ve işiniz bitti.