5

Tôi gặp vấn đề với chế độ xem bảng không cập nhật khi tôi lập trình thay đổi một số thuộc tính được quản lý hiện có. Tôi mong đợi NSFetchedResultsControllerDelegate của tôi sẽ được gọi trong trường hợp này, nhưng không phải vậy.Dữ liệu cốt lõi: cập nhật đối tượng được quản lý không gọi NSFetchedResultsControllerDelegate

của Apple doc nói:

Một thể hiện của NSFetchedResultsController sử dụng các phương pháp trong giao thức này để thông báo cho đại biểu của mình rằng lấy kết quả của bộ điều khiển đã được thay đổi do một add, loại bỏ, di chuyển, hoặc cập nhật hoạt động.

Để biết thêm chi tiết, đối tượng được quản lý của tôi dưới dạng thuộc tính int được gọi là status có giá trị từ enum. Chế độ xem bảng của tôi chỉ hiển thị các đối tượng có số status bằng upToDate (một trong các giá trị của enum). Để làm như vậy, FetchedResultController tôi có một vị mà kiểm tra cho tình trạng đó:

predicate = [NSPredicate predicateWithFormat:@"doc.status == %d", upToDate]; 

Nó hoạt động tốt, nhưng bản cập nhật không được phản ánh khi tôi thay đổi một đối tượng out-of-date trở lại tình trạng upToDate. Mã của tôi được sửa đổi từ mẫu của Apple.

Đây là những gì tôi đã cố gắng:

myObject.status = [NSNumber numberWithInt:upToDate]; 
[managedObjectContext save:nil]; 
[managedObjectContext processPendingChanges]; 
[myTableView reloadData]; 

Và cuối cùng, tôi quản lý để có cập nhật xem bảng của tôi với một lời kêu gọi:

[fetchedResultsController performFetch:&error]; 
[myTableView reloadData]; 

Nhưng thậm chí sau đó, không ai trong số NSFetchedResultsControllerDelegate phương pháp của tôi có được được gọi là mâu thuẫn với tài liệu của Apple. Ngoài ra, không có hoạt ảnh mượt mà nào xảy ra.

Tôi mong đợi controllerWillChangeContent:, controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:controllerDidChangeContent: để được gọi.

Tôi cho rằng tôi đã bỏ sót điều gì đó, có thể là điều gì đó hiển nhiên, nhưng tôi không thể nhìn thấy gì. performFetch: có cần được gọi mỗi khi một số đối tượng được quản lý có khả năng thay đổi không? Khi nào thì NSFetchedResultsControllerDthực sự là số gọi đại diện của họ?

Cảm ơn.

+0

Bất kỳ giải pháp nào bạn tìm thấy cho hành vi này? Đang phải đối mặt với các tình huống tương tự khi cuộc gọi lại đại biểu của tôi không bao giờ được kích hoạt cho hoạt động cập nhật. Việc thêm các đối tượng mới hoặc xóa các đối tượng hiện có bằng cách nào đó cũng gọi phương thức ủy nhiệm. Nguyên nhân có thể là gì? –

Trả lời

0

Nếu các phương thức ủy nhiệm FRC không bao giờ được gọi bất kể loại thay đổi thì giải thích có khả năng nhất là đại biểu không được cấu hình đúng. Nó có thể được gây ra bởi:

  1. Các đại biểu là đơn giản không được thiết lập
  2. Lớp đại biểu không khai báo giao thức NSFetchedResultsControllerDelegate.
  3. Bạn thực hiện các thay đổi trong ngữ cảnh khác mà không cần hợp nhất.

Tôi khuyên bạn nên ghi lại lỗi của thao tác lưu để đảm bảo không có gì xảy ra với lần lưu.

FRC phải được thông báo về bất kỳ thay đổi nào đối với ngữ cảnh của FRC bất kể chúng có được lưu hay không. FRC sau đó sẽ thông báo cho đại biểu của mình.

+1

1. 'aFetchedResultsController.delegate = self;' hiện diện 2. Đã chọn hai lần. 3. Tôi chỉ có một ngữ cảnh, được truyền từ ứng dụng đại biểu. Như tôi đã viết, về cơ bản nó là mã vani của Apple. Bất kỳ ý tưởng nào khác để kiểm tra? Và dĩ nhiên là tôi có lỗi khi lưu. Tôi chỉ đơn giản hóa đoạn mã của tôi cho câu hỏi này. –

0

Tôi đã có điều này chỉ xảy ra với một initWithFetchRequest: managedObjectContext: sectionNameKeyPath: cacheName: nơi sau đó sectionNameKeyPath là không nil. Nếu tôi đảm bảo rằng sectionNameKeyPath là nil thì tôi nhận được các cập nhật như tôi mong đợi.

Tôi vẫn đang điều tra lý do tại sao điều này xảy ra

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