Tôi nghĩ rằng tôi hiểu thông báo lỗi: CoreData không thể hoàn thành lỗi, nhưng tôi không chắc chắn cách xử lý nó.CoreData không thể hoàn thành lỗi khi đối tượng được cập nhật bằng dịch vụ HTTP
Chúng tôi có một ứng dụng mà chúng tôi sử dụng Dữ liệu cốt lõi để lưu giữ dữ liệu tồn tại từ một dịch vụ JSON. Hôm nay tôi đang làm như sau.
- Fetch đối tượng cục bộ từ cửa hàng dai dẳng và trở về giao diện người dùng
- Hỏi máy chủ nếu đối tượng được cập nhật - khi tôi nhận được câu trả lời, tôi cập nhật các dữ liệu cốt lõi quản lý đối tượng
- Cập nhật giao diện người dùng với mục đích cập nhật
Vấn đề là; ngay cả khi tôi không sử dụng đa luồng, đôi khi tôi nhận được lỗi khi yêu cầu HTTP xóa các đối tượng được quản lý mà giao diện người dùng của tôi đã giữ lại. Tôi đã cố gắng lấy các đối tượng với hàm returnObjectsAsFaults thành NO. Tôi nghĩ rằng tôi sau đó có thể truy cập tất cả các mối quan hệ và tài sản của một đối tượng quản lý ngay cả khi nó đã bị xóa (miễn là giao diện người dùng của tôi đã giữ lại nó).
Tôi nên giải quyết vấn đề này như thế nào?
Tôi nghĩ mình có thể sử dụng NSManagedObjectContext riêng để đọc và ghi. Tôi đã thực hiện kiểm tra này:
MyAuthorMO *authorUpdate = [[MyAuthorMO alloc] init]; // I have made this init insert the object into the updateContext
authorUpdate.firstname = @"Hans";
authorUpdate.lastname = @"Wittenberg";
authorUpdate.email = @"[email protected]";
NSManagedObjectContext *updateContext = [[MyCoreManager getInstance] managedObjectContext];
NSError *error = nil;
[updateContext save:&error];
NSManagedObjectContext *readContext = [[MyCoreManager getInstance] readOnlyContext];
NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:@"authorByEmail" substitutionVariables:[NSDictionary dictionaryWithObject:@"[email protected]" forKey:@"EMAIL"]];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSArray *authors = [readContext executeFetchRequest:fetchRequest error:&error];
MyAuthorMO * readAuthor = [authors objectAtIndex:0];
// Delete the author with update context:
[updateContext deleteObject:authorUpdate];
[updateContext save:&error];
NSLog(@"Author: %@ %@, (%@)", readAuthor.firstname, readAuthor.lastname, readAuthor.email);
Nhật ký được xuất tốt nhất miễn là tôi sử dụng readContext để tìm nạp. Nếu tôi sử dụng updateContext cho tìm nạp, tôi nhận được một ngoại lệ. Điều này có vẻ đầy hứa hẹn, nhưng tôi sợ rằng tôi sẽ gặp phải vấn đề ở giai đoạn sau. Sớm hay muộn tôi có lẽ sẽ cố gắng truy cập vào một tài sản mà không được lấy hoàn toàn (một lỗi). Làm thế nào tôi có thể đạt được hành vi mà tôi đang tìm kiếm?
Nick, có thể bạn đã đúng. Tôi đã đọc qua các bài viết trước đó của mình và chấp nhận các giải pháp tốt nhất. Cám ơn bạn đã góp ý. – Andi