Theo câu trả lời Daniel Eggert trong this question, khi sử dụng một bối cảnh đối tượng được quản lý với NSPrivateQueueConcurrencyType
đó là cần thiết để làm bất cứ điều gì mà chạm vào nó hoặc đối tượng thuộc về nó trong vòng performBlock:
hoặc performBlockAndWait:
Có cần phải đọc Dữ liệu cốt lõi trong performBlock khi sử dụng NSMainQueueConcurrencyType không?
là giống nhau đúng đối với NSMainQueueConcurrencyType
? Hãy tưởng tượng đoạn mã sau chạy trên các chủ đề chính, trong một UIViewController ví dụ:
self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease];
//moc setup
__block RHWidget *widget = nil;
[self.moc performBlockAndWait:^{
widget = [(RHWidget *)[self.moc objectWithID:self.widgetObjectID] retain];
}];
self.labelView.text = widget.descriptionString;
[widget release];
Có an toàn để sử dụng widget bên ngoài khối, vì chúng ta biết chúng ta đang ở trên các chủ đề chính? Hoặc nó là cần thiết để làm điều này:
__block NSString *description = nil;
[self.moc performBlockAndWait:^{
RHWidget *widget = (RHWidget *)[self.moc objectWithID:self.widgetObjectID];
description = [widget.descriptionString copy];
}];
self.labelView.text = description;
[description release];
Đừng mọi thứ thay đổi nếu có NSManagedObjectContext
khác trên mạng, khả năng của các loại hàng đợi tin, làm việc trong các khối và đẩy những thay đổi lên đến self.moc như một parentContext
?
Đây là một ví dụ hơi khó hiểu, nhưng sẽ rất tuyệt khi chuyển một cách an toàn tiện ích đó đến, ví dụ, một bộ điều khiển chế độ xem cần truy cập một số thuộc tính của tiện ích. Tôi có nên vượt qua objectID của tiện ích thay thế và tìm nạp nó trong vòng performBlock:
trong trình điều khiển chế độ xem mới không?
Có một bài viết rất toàn diện [ở đây] (http://www.cocoanetics.com/2012/07/multi-context-coredata/) mô tả các cách tiếp cận khác nhau bao gồm các loại tương tranh ngữ cảnh và bối cảnh lồng nhau. –