NSFetchedResultsController 部分名称 - 跟踪效率
Posted
技术标签:
【中文标题】NSFetchedResultsController 部分名称 - 跟踪效率【英文标题】:NSFetchedResultsController sections name - Tracking EFFICIENCY 【发布时间】:2012-12-04 07:20:37 【问题描述】:这是我的核心数据结构
实体 - 类别
Attr - Id(NSString) 主键,名称(NSString)
实体 - 产品
Attr - Id(NSString), name(NSString), parentCategoryId(NSString) 外键 em>,....
从上面可以看出,Category中的Id指向Product中的parentCategoryId。
在这种情况下,我想使用 name from category 与相关的 parentCatrgoryId from product 作为 UITableView 的部分名称。(我使用 @"parentCategoryId" 作为键到 fetchrequest 中的 NSSortDescriptors) 但 parentCatrgoryId 只是字母数字文本。
如何将字母数字文本(即 parentCatrgoryId from product 解码为 name from category
编辑
这就是我所做的及其工作。但我想问的是我所做的是否有效。
我添加了一个名为 parentCategoryIdName 的属性,并通过计算一些简单的操作来使用它来存储确切的名称。
.h 文件
@property (nonatomic, retain) NSMutableArray *categoryArr;
@property (nonatomic, retain) NSMutableArray *productArr;
.m 文件
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:self.MOContext];
// Setup the fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
// [request setPredicate:[NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]];
NSError *error;
NSMutableArray *mutableFetchResults = [[self.MOContext executeFetchRequest:request error:&error] mutableCopy];
[self setCategoryArr: mutableFetchResults];
NSEntityDescription *entity2 = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:self.MOContext];
// Setup the fetch request
NSFetchRequest *request2 = [[NSFetchRequest alloc] init];
[request2 setEntity:entity2];
// [request2 setPredicate:[NSPredicate predicateWithFormat:@""]];
NSError *error2;
NSMutableArray *mutableFetchResults2 = [[self.MOContext executeFetchRequest:request2 error:&error2] mutableCopy];
[self setProductArr: mutableFetchResults2];
在数据库中插入数据
for (int i=0; i< [self.productArr count]; i++)
Product *productEnt = [self.productArr objectAtIndex:i];
NSManagedObjectContext *context = self.MOContext;
for (int j=0; j<self.categoryArr.count; j++)
Category *categroy = [self.categoryArr objectAtIndex:j];
if ([categroy.objectId isEqualToString:productEnt.parentCategoryId])
[productEnt setParentCategoryIdName:categroy.name];
// Save the context.
NSError *error = nil;
if (![context save:&error])
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
【问题讨论】:
您能否发布您的获取请求代码。 你可以在这里看到***.com/questions/5011363/… 查看我编辑的问题。它包括答案,但我想知道我所做的是否有效? 【参考方案1】:回顾一下: 根据我收集的信息,您需要 id/name 来形成部分并将其显示在部分的标题中。
您的解决方案将是有效的 IMO,但它应该是最后的手段:
想法: 当您必须返回时,我会从 categoryId JIT 中获取 categoryName titleForSectionAtIndex:
或者如果这太慢了。
在重新加载结果时获取所有部分名称。
=> 不要将它们保存在数据库中并重复数据
但是
如果你看到它真的太慢了,那么以这种方式对你的数据进行非规范化是很好的 IMO(它应该是最后考虑的解决方案)
【讨论】:
你说的我听不懂。所以根据你在我编辑的问题中的回答效率不高。对吗? 我说:效率高但效果不好,应该是不得已而为之 好的,知道了。我的部分是使用viewForHeaderInSection
自定义的。在返回 UIView 的同时从 categoryId 获取 categoryName 对我来说似乎很慢,因为这个方法在你滚动表格时被调用以上是关于NSFetchedResultsController 部分名称 - 跟踪效率的主要内容,如果未能解决你的问题,请参考以下文章