Objective c 滚动表格时对核心数据发出获取请求
以下是我在CellForRowatineXpath中调用的内容: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
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。对不起,我没有正确阅读问题。更详细的答案如下