2013-10-18 14 views
6

Tôi có sau thiết lập Lõi dữ liệu trong ứng dụng của tôi:Core Data: bối cảnh mẹ và thay đổi công tác tuyên truyền

Persistent Store Coordinator 
^Background MOC (NSPrivateQueueConcurrencyType) 
    ^Main Queue MOC (NSMainQueueConcurrencyType) 

Đây là mã khởi tạo:

_backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
[_backgroundContext setPersistentStoreCoordinator:self.coordinator]; 
_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
[_mainContext setParentContext:_backgroundContext]; 

tôi sử dụng MOC nền cho nhập khẩu lớn lượng dữ liệu. Tôi cũng sử dụng nó để thực hiện các yêu cầu tìm nạp phức tạp trong nền và sau đó chuyển các ID đối tượng vào hàng đợi chính để tìm nạp các đối tượng bằng cách sử dụng các ID này.

Điều này hoạt động khá tốt. Tuy nhiên, tôi không chắc chắn làm thế nào để cho hàng đợi chính MOC biết về những thay đổi được thực hiện trong nền MOC. Tôi biết rằng nếu tôi thực hiện một yêu cầu tìm nạp trên hàng đợi chính MOC, nó sẽ nhận được những thay đổi, nhưng đó không phải là những gì tôi muốn.

Bạn có thể sử dụng thông báo NSManagedObjectContextObjectsDidChangeNotification được đăng bởi nền MOC và gọi mergeChangesFromContextDidSaveNotification: trên hàng đợi chính MOC không? Điều này sau đó sẽ gây ra thông báo NSManagedObjectContextObjectsDidChangeNotification của hàng đợi chính MOC để kích hoạt. Tôi đang nghe thông báo này trong bộ điều khiển chế độ xem của tôi và kiểm tra userInfo để thay đổi và hiển thị lại dữ liệu cho phù hợp. Tôi nghĩ bạn thường làm theo cách này nếu bạn có một điều phối viên lưu trữ liên tục với hai MOC đính kèm. Nhưng tôi không chắc đó có phải là cách làm đúng hay không, khi bạn có bối cảnh con/cha mẹ.

Trả lời

3

Tôi muốn nói rằng việc nghe thông báo NSManagedObjectContextObjectsDidChangeNotification có lẽ không phải là giải pháp tốt nhất.

Cách tôi thực hiện và nó hoạt động như sau. Đây là chính tạo bối cảnh:

_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
_mainContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy; 
_mainContext.persistentStoreCoordinator = _persistentStoreCoordinator; 

Dưới đây là sự sáng tạo bối cảnh nền:

_backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
_backgroundContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy; 
_backgroundContext.parentContext = self.mainContext; 

Bây giờ, bối cảnh nền duy nhất là để viết (hoặc đọc) đối tượng (có thể là chủ đề nền). Ngữ cảnh chính chỉ để đọc từ hàng đợi chính. Lưu trên bối cảnh nền sẽ trông giống như:

__block BOOL saved = [_backgroundContext save:error]; 
if (saved && _backgroundContext.parentContext) { 
    [_backgroundContext.parentContext performBlockAndWait:^{ 
     saved = [self.parentContext save:error]; 
    }]; 
} 

Phương pháp lưu này đảm bảo rằng mọi thay đổi sẽ được truyền đến ngữ cảnh chính. Nếu bạn làm rất nhiều công việc trong nhiều chủ đề nền, hãy làm quen với phương thức performBlockAndWait:, cung cấp loại trừ lẫn nhau về ngữ cảnh.

Nếu bạn muốn được thông báo về các thay đổi của đối tượng, bạn không phải nghe thông báo, bạn có thể chỉ cần thiết lập NSFetchedResultsController và đăng ký làm đại biểu của nó.

3

Có MOC chính sử dụng MOC mẹ riêng cho I/O không đồng bộ là tốt. Tuy nhiên, bạn không nên sử dụng MOC mẹ đó cho bất kỳ thứ gì ngoài việc thực hiện công việc nền thay mặt cho MOC chính. Có nhiều lý do cho điều này (trong số đó có hiệu suất và các vấn đề khó chịu liên quan đến ID đối tượng tạm thời).

Nếu bạn muốn cập nhật nền của cửa hàng, dưới đây là những gì tôi đề xuất.

PSC <--+-- PrivateMOC <---- MainMOC 
     | 
     +-- BackgroundPrivateMOC 

Điều này sẽ cho phép hoạt động nền gây gián đoạn tối thiểu cho MOC chính, đồng thời cho phép chia sẻ PSC.

Bây giờ, để chia sẻ dữ liệu ...

MainMOC nên lắng nghe và hợp nhất các thông báo DidSave từ BackgroundPrivateMO.

BackgroundMOC có thể nghe và hợp nhất các thông báo DidSave từ PrivateMOC.

Điều này cho phép hợp nhất để chỉ sử dụng ID đối tượng cố định và tối ưu hóa hiệu suất.

+0

Có thể biến BGPrivateMOC thành con của mainMOC và truyền bá tất cả thay đổi BG bằng cách lưu BGPrivateMOC không? Tôi đã cố gắng làm như vậy, nhưng mainMOC của tôi đã không nhận được bất kỳ thay đổi nào từ BGPrivateMOC. Quyết định thử stack của bạn. Nó hoạt động như một say mê. –

+0

Ồ, đã xảy ra sự cố, nó không hoạt động nữa. Hợp nhất không cập nhật ngữ cảnh chính. –

+0

Bạn cần cung cấp thêm chi tiết hơn ... có thể nhập câu hỏi mới với chi tiết về vấn đề cụ thể của bạn ... và có thể nhận xét ở đây về câu hỏi đó nếu bạn muốn tôi xem ... –

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