Saya memiliki Model Data Inti dengan tiga entitas:Person
, Group
, Photo
dengan hubungan di antara keduanya sebagai berikut:
- Orang ‹‹-----------> Grup (hubungan satu ke banyak)
- Orang ‹-------------> Foto (satu lawan satu)
Saat saya melakukan pengambilan menggunakan NSFetchedResultsController
di UITableView
, saya ingin mengelompokkan objek Person
ke dalam beberapa bagian menggunakan atribut name
entitas Group
.
Untuk itu, saya menggunakan sectionNameKeyPath:@"group.name"
.
Masalahnya adalah ketika saya menggunakan atribut dari hubungan Group
, NSFetchedResultsController
mengambil semuanya di muka dalam kumpulan kecil yang terdiri dari 20 (saya punya setFetchBatchSize: 20
) alih-alih mengambil kumpulan saat saya menggulir tableView
.
Jika saya menggunakan atribut dari entitas Person
(seperti sectionNameKeyPath:@"name"
) untuk membuat bagian, semuanya berfungsi dengan baik: NSFetchResultsController
memuat sejumlah kecil 20 objek saat saya menggulir.
Kode yang saya gunakan untuk membuat instance NSFetchedResultsController:
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:[Person description]
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Specify how the fetched objects should be sorted
NSSortDescriptor *groupSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"group.name"
ascending:YES];
NSSortDescriptor *personSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthName"
ascending:YES
selector:@selector(localizedStandardCompare:)];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:groupSortDescriptor, personSortDescriptor, nil]];
[fetchRequest setRelationshipKeyPathsForPrefetching:@[@"group", @"photo"]];
[fetchRequest setFetchBatchSize:20];
NSError *error = nil;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
NSLog(@"Error Fetching: %@", error);
}
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"group.name" cacheName:@"masterCache"];
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
Inilah yang saya dapatkan di Instrumen jika saya membuat bagian berdasarkan "group.name"
tanpa interaksi apa pun dengan UI Aplikasi:
Dan inilah yang saya dapatkan (dengan sedikit menggulir di UITableView) jika sectionNameKeyPath nihil:
Tolong, adakah yang bisa membantu saya mengatasi masalah ini?
EDIT 1:
Tampaknya saya mendapatkan hasil yang tidak konsisten dari simulator dan Instrumen: ketika saya menanyakan pertanyaan ini, aplikasi dimulai di simulator dalam waktu sekitar 10 detik (oleh Time Profiler) menggunakan kode di atas.
Namun saat ini, dengan menggunakan kode yang sama seperti di atas, aplikasi dimulai di simulator dalam waktu 900 md meskipun aplikasi melakukan pengambilan di muka sementara untuk semua objek dan tidak memblokir UI.
Saya telah melampirkan beberapa tangkapan layar baru:
EDIT 2: Saya menyetel ulang simulator dan hasilnya menarik: setelah melakukan operasi impor dan keluar dari aplikasi, proses pertama terlihat seperti ini: Setelah sedikit menggulir: Sekarang inilah yang terjadi pada putaran kedua: Setelah putaran kelima:
EDIT 3: Menjalankan aplikasi untuk ketujuh kalinya dan delapan kali, saya mendapatkan ini: