2012-01-20 38 views
6

Tôi có vấn đề nghiêm trọng vì tôi đã di chuyển logic dữ liệu cốt lõi của mình sang RKManagedObjectStore. Tôi thiết lập một NSFetchedResultsController với bối cảnh thiết lập để [NSManagedObject managedObjectContext] trong các chủ đề chính trong bộ điều khiển xem:Restkit [NSManagedObject managedObjectContext] trả về các phiên bản khác nhau

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

tôi chèn các đối tượng trong bối cảnh như thế này:

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

Nhưng kết quả điều khiển vời không được thông báo về các thay đổi. Do đó, tôi đã đăng ký thông báo theo cách thủ công:

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

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

Điều này thực sự không cần thiết tôi nghĩ, vì RKManagedObjectStore hợp nhất các thay đổi trong các ngữ cảnh khác nhau. Thứ hai, để xóa đối tượng Mục tôi đã thử

[item deleteEntity]; 

Điều này đã tạo ra lỗi khi không thể xóa đối tượng trong ngữ cảnh khác. Điều này rõ ràng là đúng, nhưng TẠI SAO địa ngục là bối cảnh không phải là cùng một ví dụ cho Chủ đề chính? Tôi gọi sau đây cũng bên trong bộ điều khiển xem ngay trước khi xóa en thực thể:

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

Nhìn vào managedObjectContext Thực hiện getter RKManagedObjectStore của được gọi khi sử dụng [NSManagedObject managedObjectContext], cùng một ví dụ cho mỗi thread nên được trả lại:

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

Trả lời

9

Cuối cùng tôi đã theo dõi nó xuống lỗi khó chịu sau hàng giờ gỡ lỗi. Vấn đề là RKObjectManager giữ một tham chiếu đến RKManagedObjectStore. Nhưng bằng cách nào đó khi sử dụng ARC, tham chiếu đó không được giữ trong phiên bản [RKObjectManager sharedManager] và đang được deallocated. Điều đó gây ra đỏ bừng của bộ nhớ cache cục bộ luồng. Do đó, việc hợp nhất bối cảnh đối tượng được quản lý không hoạt động vì mỗi lần truy cập một ngữ cảnh được quản lý mới được tạo ra. Việc sửa chữa rất dễ dàng. Chỉ cần giữ một tham chiếu mạnh mẽ đến RKManagedObjectStore trong App Delegate của bạn và bạn đã hoàn tất.

Các vấn đề liên quan