2015-03-19 63 views
0

在我的应用程序中,我使用CoreData来保存数据。我有一个我的viewController过滤器。像Sort by NSDatefilter by any value。在这个视图控制器我有UITableViewNSMutableArray填充并有不同的过滤器按钮。首先,我从CoreData表中提取所有数据,并将其存储到此NSMutableArray中,并执行[tableView reloadData]通过Coredata或NSMutableArray使用NSPredicate进行筛选的最佳方法是什么?

现在执行筛选我正在使用NSPredicate。所以我的问题是,哪种方法很好做滤波。我是否应该将此谓词传递给NSFetchRequest,从CoreData表中获取所有数据并再次存储到数组中并重新载入表,或者将其传递到数组中并重新载入。

哪一个是最快的并且消耗较少的内存。

回答

1

这真的取决于情况。

想象一下,您正在取得洛杉矶餐厅的评论。如果您希望用户过滤中国餐馆,然后过滤意大利餐馆,则可能会更快地获取洛杉矶的所有餐馆(即,不使用提取上的谓词),但可以使用谓词产生对象数组并将结果传递给表视图。当用户过滤意大利餐馆时,您已经在结果数组中获得了可用数据,因此过滤该数据会很快。但是,将所有餐馆存放在洛杉矶可能会导致结果排列太大以至于浪费记忆。如果用户永远不会重新存储数据,那么您就无法获取该数据。

如果您期望得到的数据集非常庞大,那么对提取进行过滤(即只提取您需要的数据)会更有意义。但是,如果用户重新提供意大利餐厅的数据,则必须再次提取,这将需要更多时间。

毫无疑问,内存和时间是一个折衷。哪一个更正确取决于数据和应用程序的可能使用...

+0

#Josh,感谢您的回答。对我来说,在我第一次显示所有的数据到表中,但如果用户点击过滤器,那么只有我必须执行过滤功能。 – iKT 2015-03-19 08:42:16

1

原谅我 - 这是iOS8前的旧学校 - 仍然在从UISearchDisplayController升级应用程序UISearchController的过程。

所以牢记这一点,让我们先来定义一些属性开始...

一个可变的数组变量:

@property (nonatomic, retain) NSMutableArray *searchResults; 

和几个字符串变量:

@property (nonatomic, strong) NSString *stringSearchBarText; 
@property (nonatomic, strong) NSString *searchAttribute; 

searchAttribute属性设置为在我的代码中启用控制器多态性,但您可以将其设置为Static或使用setter分配值。

然后用这个(预iOS8上)UISearchDisplayController委托方法:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
    // Set search predicate and filter array 
    if (searchString && searchString.length) { 
     [self setStringSearchBarText:searchString]; 
     NSPredicate *searchPredicate = nil; 
     NSArray *fetchedObjects = nil; 
     NSMutableArray *arrayResults = nil; 

     [self.searchResults removeAllObjects]; 

     searchPredicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", self.searchAttribute, searchString]; 
     fetchedObjects = self.fetchedResultsController.fetchedObjects; 
     arrayResults = [NSMutableArray arrayWithArray:[fetchedObjects filteredArrayUsingPredicate:searchPredicate]]; 
     [self setSearchResults:arrayResults]; 
    } 
    // Return YES to reload the search result table view 
    return YES; 
} 

OR

更简单地回答你的问题,不要运行其他抓取,只需将你的数据已经提取到NSMutableArray并使用便捷方法filteredArrayUsingPredicate:过滤该数据。更便宜,更容易。


而且,它可能是值得指出的是,我们不应该害怕的大型数据集,因为有一些机制来控制数据的大小设置您最初获取。

对于我来说,这并不比我在书中的实用书架 - “核心数据,第二版,适用于iOS,OS X和iCloud的数据存储和管理”(2013年1月)Marcus S. Zarra ,特别是第4章标题为“性能调优”。

IMO名列榜首在核心数据了坚实的教育。

+0

#andrewbuilder,谢谢。在这两种情况下,我只使用NSPredicate,但是这种使用数组的过滤方法比CoreData获取更快吗? – iKT 2015-03-19 10:33:22

+1

每个人的实施都略有不同。如果您想知道与您的实现相关的速度差异,我建议您安装一些精心设置的'NSLog'来记录完成数据集和加载表视图所需的时间。为每个选项执行此操作 - “NSFetchRequest”和“filteredArrayUsingPredicate” - 并注意差异。我建议使用今天的硬件/软件组合,除非你处理海量数据集,否则这些差异将是微不足道的。我个人认为我的答案是我的应用程序的最佳解决方案。 – andrewbuilder 2015-03-19 10:48:16

相关问题