0

好的,情况就是这样。我正在制作一个程序,您可以在其中保存和加载包含文本和图像(一些非常大的图像)的文档。对于后端,我使用 CoreData和我自己的子类 UIManagedDocument(我们称之为NotificationDocument.NSManagedDocument

现在每个NotificationDocument都有两个属性,代表它保存在哪个保存槽以及它保存的名称是什么。我有一个 TableView,它显示了我的文档列表以及它们所在的保存槽(例如:“保存槽 1:清洁模板”)。

但是,我需要永远填充这个 tableview。我正在做的是 viewDidLoad 是:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NotificationDocument"];
NSArray *notifications = [self.database.managedObjectContext executeFetchRequest:fetchRequest error:nil];

怀疑我的程序运行如此缓慢似乎是合乎逻辑的,因为我正在完整检索所有通知文档并将它们移动到内存中。有没有更好(更快)的方法来做到这一点,因为我真的不需要所有的通知文档,我只需要它们的保存槽和保存名称属性。实现这一目标的最佳方法是什么?

我考虑过在 CoreData 中存储一个映射实体映射保存槽到保存在其中的名称。但是,如果有一种很好的方法可以在不保存完全独立的实体的情况下做到这一点,那将是可取的。谢谢。

4

3 回答 3

3

您应该使用 anNSFetchedResultsController来动态填充您的UITableView。这样,它将在请求新单元格时动态调用核心数据,而不是您当前的方法,它一次加载所有数据,即使在加载视图时不需要大部分数据。

这里大致是你应该设置数据的代码(fetchedResultsController 应该是它所在的视图控制器的属性)

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NotificationDocument"];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"attribute" ascending:NO];
    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];


    fetchedResultsController = [[NSFetchedResultsController alloc]
                                initWithFetchRequest:fetchRequest
                                managedObjectContext:self.database.managedObjectContext
                                sectionNameKeyPath:nil
                                cacheName:@"ListCache"];
    fetchedResultsController.delegate = self;
    NSError *error = nil;
    [fetchedResultsController performFetch:&error];

这是获取正确文档的行cellForRowAtIndexPath(显然可能不是正确的对象类)

NotificationDocument *currentDocument = [fetchedResultsController objectAtIndexPath:indexPath];

这样做,你会发现速度有很大的提高。

于 2012-06-19T20:54:47.563 回答
0

正如 Dima 所说,可能使用 NSFetchedResultsController 是要走的路。

我以前用过,如果你想看看,看看这个:

https://github.com/rafaeladson/intern-objc/blob/master/InternIOS/BaseTableViewController.m

https://github.com/rafaeladson/intern-objc/blob/master/UnitTests/SampleTableViewController.m

https://github.com/rafaeladson/intern-objc/blob/master/UnitTests/BaseTableViewControllerTest.m

如果这不起作用,请尝试使用 Xcode 中的 Instruments 应用程序来分析您的问题所在。

于 2012-06-19T21:00:08.667 回答
0

为了从核心数据中检索一组项目,您还可以使用

[nsfetchReqObj setFetchBatchSize:size];

它还将提高获取速度。

于 2014-02-20T07:37:03.197 回答