gpt4 book ai didi

iphone - 如何循环遍历 nsfetchedresultscontroller

转载 作者:行者123 更新时间:2023-12-03 18:50:25 27 4
gpt4 key购买 nike

在我的应用程序中,我需要循环遍历核心数据中的所有实体,并且我正在使用 NSFetchedresultcontroller。

我现在正在这样做:

NSArray *tempArray = [[NSArray alloc] initWithArray:self.fetchedResultsController.fetchedObjects];

for (MyClass *item in tempArray)
{
// do something
}

[tempArray release]; tempArray = nil;

有没有更好的方法可以在不创建 tempArray 的情况下做到这一点?

非常感谢

最佳答案

取决于你想做什么。如果您只是更改一个值,那么是的,有一个更简单的方法:

[[[self fetchedResultsController] fetchedObjects] setValue:someValue forKey:@"someKey"]

这将循环遍历所有设置该值的对象。这是标准的 KVC 操作。请注意,这将扩展内存,因为每个实体都会在突变过程中被实现。

如果您需要对每个实体做更多的事情,或者遇到内存问题,那么事情会变得更加复杂。注意:在编码优化阶段之前不要担心内存。内存问题的预优化,尤其是 Core Data 的内存问题,是浪费时间。

这个概念是您将循环每个实体并根据需要更改它。此外,在某个时刻,您应该保存上下文,重置它,然后耗尽本地自动释放池。这将减少内存使用量,因为在拉入下一批之前,您会将刚刚操作的对象从内存中推回。例如:

NSManagedObjectContext *moc = ...;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSInteger drainCounter = 0;
for (id object in [[self fetchedResultsController] fetchedObjects]) {
//Do your magic here
++drainCounter;
if (drainCounter = 100) {
BOOL success = [moc save:&error];
NSError *error = nil;
NSAssert2(!success && error, @"Error saving moc: %@\n%@", [error localizedDescription], [error userInfo]);
[moc reset];
[pool drain], pool = nil;
pool = [[NSAutoreleasePool alloc] init];
drainCounter = 0;
}
}

BOOL success = [moc save:&error];
NSError *error = nil;
NSAssert2(!success && error, @"Error saving moc: %@\n%@", [error localizedDescription], [error userInfo]);
[pool drain], pool = nil;

这会降低内存使用量,但昂贵!!每 100 个对象就会访问一次磁盘。仅当您确认内存存在问题后才应使用此功能。

关于iphone - 如何循环遍历 nsfetchedresultscontroller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3512872/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com