ฉันมี Core Data Model ที่มีสามเอนทิตี:Person
, Group
, Photo
ที่มีความสัมพันธ์ระหว่างกันดังนี้:
- บุคคล ‹‹-----------> กลุ่ม (ความสัมพันธ์แบบหนึ่งต่อหลาย)
- บุคคล ‹-------------> รูปถ่าย (ตัวต่อตัว)
เมื่อฉันทำการดึงข้อมูลโดยใช้ NSFetchedResultsController
ใน UITableView
ฉันต้องการจัดกลุ่มออบเจ็กต์ Person
ในส่วนต่างๆ โดยใช้แอตทริบิวต์ name
เอนทิตีของ Group
เพื่อสิ่งนั้น ฉันใช้ sectionNameKeyPath:@"group.name"
ปัญหาคือเมื่อฉันใช้แอตทริบิวต์จากความสัมพันธ์ Group
NSFetchedResultsController
จะดึงข้อมูลทุกอย่างล่วงหน้าเป็นชุดเล็กๆ 20 ชุด (ฉันมี setFetchBatchSize: 20
) แทนที่จะดึงชุดข้อมูลในขณะที่ฉันเลื่อน tableView
หากฉันใช้แอตทริบิวต์จากเอนทิตี Person
(เช่น sectionNameKeyPath:@"name"
) เพื่อสร้างส่วนต่างๆ ทุกอย่างทำงานได้ดี: NSFetchResultsController
จะโหลดชุดเล็กๆ ของวัตถุ 20 รายการในขณะที่ฉันเลื่อน
รหัสที่ฉันใช้เพื่อสร้างอินสแตนซ์ 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;
}
นี่คือสิ่งที่ฉันได้รับจากเครื่องมือหากฉันสร้างส่วนต่างๆ ตาม "group.name"
โดยไม่มีการโต้ตอบใดๆ กับ UI ของแอป:
และนี่คือสิ่งที่ฉันได้รับ (ด้วยการเลื่อนเล็กน้อยบน UITableView) หาก SectionNameKeyPath เป็นศูนย์:
ได้โปรดใครสามารถช่วยฉันในเรื่องนี้ได้บ้าง?
แก้ไข 1:
ดูเหมือนว่าฉันได้รับผลลัพธ์ที่ไม่สอดคล้องกันจากโปรแกรมจำลองและเครื่องมือ: เมื่อฉันถามคำถามนี้ แอปจะเริ่มทำงานในโปรแกรมจำลองในเวลาประมาณ 10 วินาที (โดย Time Profiler) โดยใช้โค้ดด้านบน
แต่วันนี้ เมื่อใช้โค้ดเดียวกันกับข้างต้น แอปจะเริ่มทำงานในโปรแกรมจำลองใน 900 มิลลิวินาที แม้ว่าจะทำการดึงข้อมูลล่วงหน้าชั่วคราวสำหรับออบเจ็กต์ทั้งหมดและไม่ได้บล็อก UI ก็ตาม
ฉันได้แนบภาพหน้าจอใหม่บางส่วน:
แก้ไข 2: ฉันรีเซ็ตตัวจำลองและผลลัพธ์ก็น่าสนใจ: หลังจากดำเนินการนำเข้าและออกจากแอป การรันครั้งแรกจะมีลักษณะดังนี้: หลังจากการเลื่อนเล็กน้อย:
ตอนนี้นี่คือสิ่งที่เกิดขึ้นในการเรียกใช้ครั้งที่สอง:
หลังจากการรันครั้งที่ห้า:
แก้ไข 3: การรันแอปครั้งที่เจ็ดและแปดครั้ง ฉันได้รับสิ่งนี้: