我是初次使用CoreData并希望我的问题可以理解,如果不是,请在下面发表评论,如果需要我会澄清。
我在CoreData中存储了大约3k个地址。通过点击它可以获取大约200 / 3k的物体。我在表格视图中列出了它们(200个对象)。但它加载大约2秒钟,这有点慢。
我在考虑这样一个解决方案:加载10个10个对象。这意味着,只要我加载了10个项目,我就会显示这10个项目,然后再加载10个项目并再显示10个项目等等,直到所有项目都不会显示在表格视图中。
这样用户就不会看到2秒的延迟。相反,他会看到10个第一项,如果他没有快速滚动到底部,他就不会注意到任何“错误”。
我的方法是否正确?如果没有,请提供更好的建议
顺便说一句:核心数据中的字段已编入索引。
不确定它是否会有所帮助,以防万一。这是我获取数据的方式:
- (void)performFetchWithCompletionBlock:(CBFetchControllerCompletionBlock)completionBlock
{
[self.context performBlock:^{
NSError* error = nil;
NSArray* results = [self.context executeFetchRequest:self.fetchRequest error:&error];
if (error == nil)
{
NSMutableArray* mutableSections = [NSMutableArray arrayWithCapacity:self.sectionPredicatesArray.count];
[self.sectionPredicatesArray enumerateObjectsUsingBlock:^(NSPredicate* predicate, NSUInteger idx, BOOL *stop) {
NSArray* sectionItems = [results filteredArrayUsingPredicate:predicate];
NSArray* sortedItems = [sectionItems sortedArrayUsingDescriptors:self.sortDescriptors];
if (sortedItems.count)
{
NSString* sectionTitle = [self.delegate sectionTitleForSectionIndex:idx];
CBSectionInfo* section = [[CBSectionInfo alloc] initWithName:sectionTitle objects:sortedItems];
[mutableSections addObject:section];
}
}];
self.sections = [mutableSections copy];
}
dispatch_async(dispatch_get_main_queue(), ^{
completionBlock((error == nil), error);
});
}];
}
然后,完成块调用'reloadData':
- (void)refetchObjectsForQuery:(NSString*)query
{
__weak typeof(self)weakSelf = self;
[self.fetchController performFetchWithCompletionBlock:^(BOOL success, NSError *error) {
__strong __typeof(weakSelf)strongSelf = weakSelf;
if (success && [strongSelf.searchBar.text isEqualToString:query])
{
[strongSelf.tableView reloadData];
}
}];
}
如果问题很清楚,如果没有人愿意提供详细信息,请告诉我。感谢
修改: 尝试使用fetchOffest和fetchLimit,但延迟仍然相同。 不确定fetchOffest是否以正确的方式使用。我想我需要使用fetchOffest = 10来获取10然后reloadData然后再获取10个?
EDIT2 : 使用fetchLimit和fetchOffest没有帮助。我设置了offset = 0和limit = 1;请求仍然是相同的~2秒