2010-10-13 31 views
25

tôi trình bày xem bảng nội dung sử dụng NSFetchedResultsController trong đó có một vị ngữ:NSFetchedResultsController với vị bỏ qua những thay đổi sáp nhập từ NSManagedObjectContext khác nhau

[NSPredicate predicateWithFormat:@"visible == %@", [NSNumber numberWithBool:YES]] 

On sợi nền sử dụng riêng biệt NSManagedObjectContext tôi cập nhật vài trong số các đối tượng và thay đổi giá trị visible họ từ NO đến YES. Lưu, hợp nhất các thay đổi trong chủ đề chính NSManagedObjectContext. Nhưng fetchedObjects của NSFetchedResultsController không thay đổi. Bộ điều khiển cũng không gọi số -controller:didChangeObject:... trên đại biểu. Nếu thực thể được cập nhật trên chủ đề chính theo cách giống hệt nhau (ứng dụng thử nghiệm của tôi gọi cùng một phương thức), mọi thứ hoạt động như mong đợi.

Ngoài ra, thông báo NSUpdatedObjectsKey chứa các đối tượng đó.

Hiện nay các giải pháp duy nhất mà tôi đã tìm thấy là để kêu gọi mỗi người trong số NSUpdatedObjectsKey thực thể:

NSManagedObjectContext *context = ... // main thread context 
[context existingObjectWithID:[object objectID] error:nil] 

Vấn đề này là chỉ với cập nhật đối tượng mà trước đây không phù hợp với vị ngữ.

Tôi có thiếu thứ gì đó hiển nhiên không?

+0

Đó có phải là lỗi của Dữ liệu cốt lõi không? Tôi nghĩ chúng ta nên báo cáo lỗi cho Apple. Tôi vừa làm một. – an0

+0

Lỗi? Nếu có tiến bộ nào? – lostintranslation

+0

Lỗi này cuối cùng đã được sửa trong iOS 10: https://twitter.com/an0/status/750413478620491776 – an0

Trả lời

53

Tắt chính NSManagedObjectContext không có sự kiện cháy NSManagedObjectContextObjectsDidChangeNotification cho các đối tượng được cập nhật vì nó không được thực hiện cho các đối tượng bị lỗi.

Generic sửa chữa (hoặc giữ một ca khúc của các ID đối tượng cần điều trị này):

NSManagedObjectContext *context = [self managedObjectContext]; 
for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) { 
    [[context objectWithID:[object objectID]] willAccessValueForKey:nil]; 
} 

[context mergeChangesFromContextDidSaveNotification:notification]; 

Từ NSManagedObject Class Reference:

Bạn có thể gọi phương thức này với giá trị quan trọng của con số không đảm bảo rằng lỗi đã được kích hoạt, như minh họa theo ví dụ sau.

+0

Điều này đã cứu tôi rất nhiều thời gian. Tôi không thể upvote đủ. Cảm ơn bạn. –

+0

Thật tuyệt vời đối với tôi. Đã lãng phí giờ về điều này! – samvermette

+0

Không nên có cách nào để thực hiện việc này với các cài đặt khác nhau trên 'NSFetchRequest'? Tôi đã thử chỉ định 'relationshipForPrefetching' và - [NSFetchRequest setReturnsObjectAsFaults: NO]', nhưng không hoạt động. –

2

Bạn phải gọi processPendingChanges trên của bạn Bối cảnh-NSManagedObjectContext sau khi bạn sáp nhập các thay đổi từ một NSManagedObjectContext khác.

Xem Hướng dẫn CoreData Lập trình:

Lưu ý rằng các thông báo thay đổi được gửi trong phương pháp processPendingChanges NSManagedObjectContext của. Chủ đề chính được gắn vào chu trình sự kiện cho ứng dụng để processPendingChanges được gọi tự động sau mỗi sự kiện của người dùng trên các bối cảnh thuộc sở hữu của chủ đề chính . Đây không phải là trường hợp cho chủ đề nền - khi phương thức được gọi là được gọi phụ thuộc vào cả nền tảng và phiên bản phát hành, do đó bạn không nên dựa vào thời gian cụ thể. Nếu ngữ cảnh phụ không phải là trên chủ đề chính, bạn nên gọi processPendingChanges tại số các khoảng ngắt thích hợp.

+0

Bạn có chắc chắn điều này sẽ khắc phục vấn đề ở trên không? Tôi không nghĩ rằng bộ điều khiển NSFetchedResults đang lắng nghe các thông báo thay đổi từ bối cảnh * background *. –

+0

'mergeChangesFromContextDidSaveNotification:' thực hiện (gần như) cùng một quá trình với 'processPendingChanges' và đăng thông báo thích hợp. – quellish

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