2011-08-06 18 views
6

Chúng tôi nhận được "CoreData không thể thực hiện một lỗi" một lần trong một thời gian. Chúng tôi đã đọc qua tài liệu của Apple nhưng không rõ ràng về những gì được phép giữ lại. Chúng tôi đã rất cẩn thận về việc tạo ra một bối cảnh cho mỗi chủ đề, vv Tuy nhiên, một điều ứng dụng của chúng tôi đang làm là chúng tôi đang giữ lại NSManagedObjects trên UIViewControllers của chúng tôi (thường thông qua một NSArray hoặc NSDictionary). Tôi đoán những gì đang xảy ra là các mối quan hệ đối tượng đang thay đổi và chúng tôi không xử lý thông báo thích hợp.Làm cách nào để ngăn chặn "CoreData không thể thực hiện lỗi"?

Có ai có bất kỳ đề xuất nào về thiết kế tốt hơn liên quan đến Dữ liệu cốt lõi không? Khi chúng tôi nhận được lỗi, tôi không thể thấy rằng chúng tôi thực sự đã xóa bất kỳ thứ gì từ ngữ cảnh gây ra lỗi. Có cần thiết để xử lý NSManagedObjectContextObjectsDidChangeNotification trên UIViewControllers của chúng tôi nếu họ đang giữ lại trạng thái? Mọi lơi đê nghị đêu nên được đanh gia cao.

+1

Chúng tôi đã có chế độ xem không được phát hành có tham chiếu đến NSManagedObjects sau khi bị xóa. Rất khó tìm. – tjg184

Trả lời

5

Bạn có thể đăng ký thông báo thay đổi trong Dữ liệu chính. Điều này sẽ cho phép bạn cập nhật các đối tượng được quản lý của bạn khi chúng thay đổi. Xem Tài liệu chính để biết thêm thông tin. Bạn sẽ được quan tâm trong 2 phương pháp để đăng ký và đáp ứng với những thay đổi:

[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(mergeChanges:) 
               name:NSManagedObjectContextDidSaveNotification 
              object:(your NSManagedObjectContext)]; 

Các mergeChanges chọn (phương pháp của bạn) sẽ gọi phương thức sau đây để đồng bộ hóa bất kỳ thay đổi từ chủ đề khác. Nó sẽ trông giống như thế này:

- (void)mergeChanges:(NSNotification *)notification{ 
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

    // Merge changes into the default context on the main thread 
    [context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
          withObject:notification 
         waitUntilDone:YES]; 
} 
Các vấn đề liên quan