Objective c 滚动表格时对核心数据发出获取请求

Objective c 滚动表格时对核心数据发出获取请求,objective-c,ios,xcode,cocoa-touch,core-data,Objective C,Ios,Xcode,Cocoa Touch,Core Data,以下是我在CellForRowatineXpath中调用的内容: NSManagedObjectContext *context = [[AppDelegate sharedAppDelegate] managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription

以下是我在CellForRowatineXpath中调用的内容:

   NSManagedObjectContext *context = [[AppDelegate sharedAppDelegate] managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Favorites" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(link like '%@')",articleLink]];
    [fetchRequest setPredicate:requestPredicate];

    [fetchRequest setFetchBatchSize:1];
    NSError *error = nil;
    NSUInteger count = [context countForFetchRequest:fetchRequest error:&error];
    NSLog(@"Count - %d", count);
    if (count == 0)
        return NO;
    else
        return YES;
基本上,它检查我的模型中是否存在项。非常有用,但是我想在这么短的时间内发出这么多的获取请求有什么问题吗

电池管理有什么问题吗?每次调用时都是从磁盘读取吗

还有更好的吗


谢谢

您不想在滚动时进行抓取。它会破坏你的滚动性能

根据您提到的代码,您正试图根据是否存储了链接对单元格执行某些操作


我可能会在加载视图控制器并将其存储在内存中时预先执行该操作,然后在滚动时检查该值。

您不希望在滚动时执行抓取操作。它会破坏你的滚动性能

根据您提到的代码,您正试图根据是否存储了链接对单元格执行某些操作


我可能会在加载视图控制器并将其存储在内存中时预先执行该操作,然后在滚动时检查该值。

您所做的操作存在一些问题。首先,回迁非常慢,因为它确实会从磁盘上的持久存储中读取。数据库越大,查询(NSPredicate)越复杂,获取速度只会越慢

其次,您无法控制调用cellForRowAtIndexPath的次数,您只能假设在每个单元格可见时调用它一次,但在其他情况下也可能调用它。您也无法控制用户将如何使用您的ScrollView,他可能会疯狂地尝试滚动。该方法中的所有内容都必须尽可能地提高性能,并且不能减慢主线程的速度,否则您的ScrollView将不断冻结,这对用户来说非常糟糕

第三,您不断地分配和初始化新对象,在本例中是NSFetchRequests,这非常昂贵。缓存将极大地提高性能,如果可能,您应该始终避免分配新对象。尽管这已经是一个糟糕的示例,但fetchRequest可以轻松地存储为全局变量,并在每次获取之前更改其谓词

从代码中我可以看出,似乎您有一个名为Favorite的实体,其中包含一个链接,一个显示链接的TableView,您希望根据该链接是否为Favorite来更改单元格的某些内容


您应该做的是在首次加载ViewController时获取所有收藏夹,将它们的所有链接存储在一个数组中,并在cellForRowAtIndexPath中检查该数组中是否存在articleLink。这样,只有当用户在ScrollView中滚动时,您才能从内存中读取,您的性能才会达到最佳状态。

您所做的有几个问题。首先,回迁非常慢,因为它确实会从磁盘上的持久存储中读取。数据库越大,查询(NSPredicate)越复杂,获取速度只会越慢

其次,您无法控制调用cellForRowAtIndexPath的次数,您只能假设在每个单元格可见时调用它一次,但在其他情况下也可能调用它。您也无法控制用户将如何使用您的ScrollView,他可能会疯狂地尝试滚动。该方法中的所有内容都必须尽可能地提高性能,并且不能减慢主线程的速度,否则您的ScrollView将不断冻结,这对用户来说非常糟糕

第三,您不断地分配和初始化新对象,在本例中是NSFetchRequests,这非常昂贵。缓存将极大地提高性能,如果可能,您应该始终避免分配新对象。尽管这已经是一个糟糕的示例,但fetchRequest可以轻松地存储为全局变量,并在每次获取之前更改其谓词

从代码中我可以看出,似乎您有一个名为Favorite的实体,其中包含一个链接,一个显示链接的TableView,您希望根据该链接是否为Favorite来更改单元格的某些内容


您应该做的是在首次加载ViewController时获取所有收藏夹,将它们的所有链接存储在一个数组中,并在cellForRowAtIndexPath中检查该数组中是否存在articleLink。这样,只有当用户在ScrollView中滚动时,您才能从内存中读取,您的性能才会达到最佳。

请查看
NSFetchedResultsController
。这是针对这种情况的,我不认为这在这里是必要的。如您所见,我的fetchBatchSize为1。对不起,我没有正确阅读问题。下面更详细的答案请查看
NSFetchedResultsController
。这是针对这种情况的,我不认为这在这里是必要的。如您所见,我的fetchBatchSize为1。对不起,我没有正确阅读问题。更详细的答案如下