gpt4 book ai didi

ios - 多个 nsfetchedresultscontroller 或一个

转载 作者:行者123 更新时间:2023-11-28 19:50:57 25 4
gpt4 key购买 nike

我正在使用核心数据,并且我有一个包含动态数量的部分的 UITableView。

我有一个名为日期的实体 - 它有一个标题和一个指向另一个实体的关系 - 该实体的 ID 是将要显示的部分数据。

哪种方法最好,为什么?

一个。有一个 NSFetchedResultControllers 数组 - 在每个部分中,我使用谓词过滤数据。然后我只是将数据呈现给每个部分。

B.我有一个 NSFetchedResultController 并获取所有数据 - 然后在我的 CellForRow 中检查是否应该显示它们。

C.我删除了关系,并在我的实体中添加了一个名为 sectionId 的额外属性,并使用 A 或 B。

就 UI 性能而言,什么是最佳方法?

编辑:

例子 - 我有

实体 1:数据

Data Id : 0, Title : First, (Relationship) section : 0
Data Id : 1, Title : Second, (Relationship) section : 0
Data Id : 2, Title : FisrtB, (Relationship) section : 1

条目 2:SectionsName

SectionId : 0 , Name : TitleA , etc (to-many- relationhsip to Data)
SectionId : 1 , Name : TitleB , etc (to-many- relationhsip to Data)

所以,问题实际上是:

  • A.有一个返回所有数据(总共 3 个)的 FRC,然后我应该找到他们去的正确部分?
  • B.或者每个部分都有一个 FRC - 第一个 FRC 返回 top2我可以通过 indexPath.row 访问的数据,第二个相同财务报告委员会。

最佳答案

编辑以反射(reflect)对原始问题的更改

您几乎肯定应该使用原始问题中的选项 B(后续编辑中的选项 A):单个 NSFetchedResultsController,基于 Data 实体,但具有 TableView sections 由 section 关系决定。

您的抓取结果 Controller 可以完成将对象分成正确部分的所有艰苦工作:确保 FRC 底层的抓取首先按 section.sectionId(或 section .name(如果您愿意),并将 FRC 的 sectionNameKeyPath 指定为 section.sectionId(或 section.name)。然后,样板 FRC/tableView 代码会自动将对象放入正确的部分。

上述样板代码:

#pragma mark - TableView Datasource delegate

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.fetchedResultsController.sections.count;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = self.fetchedResultsController.sections[section];
return [sectionInfo numberOfObjects];
}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
Data *data = [self.fetchedResultsController objectAtIndexPath:indexPath];
....
return cell;
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = self.fetchedResultsController.sections[section];
return sectionInfo.name;
}

#pragma mark - Fetched results controller

- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Data" inManagedObjectContext:self.context];
[fetchRequest setEntity:entity];

// Edit the sort key as appropriate.
NSSortDescriptor *sectionSort = [[NSSortDescriptor alloc] initWithKey:@"section.sectionId" ascending:YES];
// Add any other sort criteria
....
NSArray *sortDescriptors = @[sectionSort, ...];
[fetchRequest setSortDescriptors:sortDescriptors];

// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.context sectionNameKeyPath:@"section.sectionId" cacheName:nil];
self.fetchedResultsController = aFetchedResultsController;
aFetchedResultsController.delegate = self;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _fetchedResultsController;
}

#pragma mark - FRC delegate methods

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView beginUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;

case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;

default:
break;
}
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;

switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;

case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;

case NSFetchedResultsChangeUpdate:
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;

case NSFetchedResultsChangeMove:
[tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath];
break;
}
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView endUpdates];
}

关于ios - 多个 nsfetchedresultscontroller 或一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29261270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com