2009-05-23 29 views
6

Tôi là ứng dụng Dữ liệu cốt lõi. Trong chủ đề của nhà sản xuất, tôi lấy dữ liệu từ một dịch vụ web và lưu nó vào đối tượng của tôi và gọi lưu lại. Đối tượng tiêu dùng của tôi là bộ điều khiển xem bảng hiển thị giống nhau. Tuy nhiên, treo ứng dụng và tôi nhận được NSFetchedResultsController Lỗi: dự kiến ​​để tìm đối tượng (đơn vị: FeedEntry; id: 0xf46f40; dữ liệu:) trong phần (null) để xóaVấn đề người tiêu dùng của nhà sản xuất với dữ liệu cốt lõi

trên console. Khi tôi gỡ lỗi, mọi thứ đều hoạt động tốt. Vì vậy, tôi hiểu rằng nó giống như một vấn đề chủng tộc.

Các loại vấn đề này được giải quyết như thế nào? Cách tốt nhất để thiết kế ứng dụng dành cho người tiêu dùng sản xuất với dữ liệu cốt lõi là gì?

Trả lời

16

Nếu bạn đang nhắm mục tiêu Leopard hoặc sau này, Apple đã làm cho mọi việc dễ dàng hơn.

Trong chuỗi nhà sản xuất của bạn tạo một MOC có cùng PSC như MOC trong chuỗi chính của bạn. Bạn có thể kéo các đối tượng từ webservice của mình trong chủ đề này, tạo các đối tượng mới và lưu chúng như bình thường.

Trong chuỗi tiêu thụ của bạn, thêm bộ điều khiển của bạn làm người quan sát cho NSManagedObjectContextDidSaveNotification. Gọi lại của bạn phải trông giống như sau:

- (void) managedObjectContextDidSave:(NSNotification *)notification 
{ 
    NSManagedObjectContext *managedObjectContext = [notification object]; 
    if(managedObjectContext != self.managedObjectContext) 
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
} 

Bằng cách này, các đối tượng được lưu trong chuỗi sản xuất sẽ được tự động kéo vào chuỗi tiêu thụ của bạn.

+1

Cảm ơn sbooth ... câu trả lời của bạn là hoàn hảo ... Đối với những người khác, Để đăng ký NSManagedObjectContextDidSaveNotification, thêm đoạn mã sau ... \t \t [[NSNotificationCenter defaultCenter] addObserver: appdelegate \t \t \t \t \t \t \t \t \t \t \t \t selector: @selector (managedObjectContextDidSave :) \t 0.123.\t \t \t \t \t tên \t \t \t \t \t \t: NSManagedObjectContextDidSaveNotification \t \t \t \t \t \t \t \t \t \t \t \t đối tượng: tự.managedObjectContext]; – Mugunth

+2

@Mugunth Kumar, vì anh ấy kiểm tra bối cảnh nào bạn có thể vượt qua nil cho param đối tượng, bạn không thể quan sát bối cảnh mới được tạo cho chuỗi bg chứ không phải ngữ cảnh của ủy nhiệm ứng dụng. – marchinram

+0

Chính xác những gì tôi đang tìm kiếm. Cảm ơn. – JHollanti

0

Dữ liệu chính thường không phải là chủ đề an toàn. Sở thích của tôi là làm công việc tối thiểu trên chuỗi nền và chuyển dữ liệu cần thiết để tạo các thực thể Core Data cho chủ đề chính khi bạn đã truy xuất nó từ dịch vụ web của mình. Tuy nhiên, hãy xem this document. Có một số chiến lược để sử dụng Dữ liệu cốt lõi qua các chủ đề nếu bạn cần.

+0

"Dữ liệu cốt lõi nói chung không phải là chủ đề an toàn" là khá gây hiểu lầm. Nếu bạn tạo một ngữ cảnh cho mỗi luồng (hoặc mỗi thao tác; ngữ cảnh khá nhẹ) phần còn lại của khung Dữ liệu cốt lõi sẽ xử lý khá nhiều thứ khác (tất cả những gì bạn phải làm là xử lý NSManagedObjectContextDidSaveNotifications như mô tả ở trên). – hatfinch

+0

Tôi đồng ý, nó rất gây hiểu nhầm. – JHollanti

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