Thông thường, bạn muốn sử dụng một riêng biệt NSManagedObjectContext
cho mỗi chủ đề đó sẽ truy cập vào db Core Data. Điều này là để ngăn chặn các đồ thị đối tượng từ khả năng nhận được vào một nhà nước không phù hợp do đồng thời viết cho cùng một bối cảnh.
Cách đơn giản nhất để xử lý việc này là tạo NSManagedObjectContext
mới cho mỗi chuỗi và chia sẻ một đơn NSPersistentStoreCoordinator
.
Tạo thuộc tính trong AppDelegate loại NSManagedObjectContext
và ghi đè trình getter để trả lại ngữ cảnh mới cho mỗi chuỗi cuộc gọi. Làm điều này bằng cách sử dụng các threadDictionary
của mỗi chủ đề.
Trước tiên, hãy thiết lập managedObjectModel và persistentStoreCoordinator như bình thường. Sau đó tạo ngữ cảnh của bạn trong appdelegate của bạn và gán cho tài sản của bạn:
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.persistentStoreCoordinator = self.storeCoordinator;
Trong managedObjectContext getter override của bạn, sử dụng đoạn mã sau để trả về một bối cảnh riêng biệt cho mỗi thread gọi:
- (NSManagedObjectContext *) managedObjectContext
{
NSThread *thisThread = [NSThread currentThread];
if (thisThread == [NSThread mainThread])
{
//For the Main thread just return default context iVar
return _managedObjectContext;
}
else
{
//Return separate MOC for each new thread
NSManagedObjectContext *threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:@"MOC_KEY"];
if (threadManagedObjectContext == nil)
{
threadManagedObjectContext = [[[NSManagedObjectContext alloc] init];
[threadManagedObjectContext setPersistentStoreCoordinator: [self storeCoordinator]];
[[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:@"MOC_KEY"];
}
return threadManagedObjectContext;
}
}
Bây giờ bất cứ nơi nào trong mã của bạn nơi bạn truy cập thuộc tính managedObjectContext của AppDelegate, bạn sẽ chắc chắn là luồng an toàn.
Nguồn
2013-07-11 14:38:15
Lý do duy nhất tôi có thể nghĩ là nếu bạn có bộ dữ liệu riêng biệt bạn có thể muốn truy cập độc lập. – Kevin