gpt4 book ai didi

ios - 核心数据保存时间过长

转载 作者:行者123 更新时间:2023-12-01 18:14:21 24 4
gpt4 key购买 nike

我在这里寻找解决问题的方法,例如:

Core Data Saves and UI Performance

Why does Core Data take so long to save an object?

很多人遇到我的问题,但是我尝试使用他们的解决方案失败。

这是我的问题:

我正在尝试在后台将10个托管对象保存在核心数据中。我没有任何错误,并且所有功能都非常不错,但是...要花13秒才能保存10个对象!我不知道我在做什么错...

我需要在数据库中保存一百个对象,如果只有十个对象需要花费13秒的时间……我真的很担心在尝试保存100个对象时会发生什么。

这是我的代码:

首先,我在后台调用我的保存功能:

[self performSelectorInBackground:@selector(updateMessageList:) withObject:response];

在这里,我保存对象:
- (void)updateMessageList:(NSArray *)messageList
{
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *tmpContext = [[NSManagedObjectContext alloc]init];
tmpContext.persistentStoreCoordinator = [app persistentStoreCoordinator];

NSError *error;

int i = 0; //Counter to log how long it takes to insert a managedObject.

for (MessageReadResponse* messageUpdate in messageList) {
NSLog(@"%d", i++);

Message *message = [NSEntityDescription insertNewObjectForEntityForName:MESSAGE_ENTITY
inManagedObjectContext:tmpContext];
[message setState:STATE_ACTIVE];
[message setFromName:[[messageUpdate from]name]];
[message setFromSurname:[[messageUpdate from]surname]];
[message setBody:[messageUpdate body]];
}

NSLog(@"Before saving");

if (![tmpContext save:&error]) {
ErrorLog(@"%@", error.description);
[ErrorManagement synchronizeApplication];

return;
}

NSLog(@"After saving");
}

这是我在主线程中合并ManagedObjectContext的位置:
- (void)manageDidSaveNotification:(NSNotification *)notification
{
NSManagedObjectContext *savedContext = [notification object];

// Ignore change notifications for the main MOC
if (__managedObjectContext == savedContext)
{
return;
}

if (__managedObjectContext.persistentStoreCoordinator != savedContext.persistentStoreCoordinator)
{
// That's another database
return;
}

dispatch_sync(dispatch_get_main_queue(), ^{
[__managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
});
}

这是我的性能日志:
2014-06-06 11:12:07.207 app-ios-client[260:8017] 0

2014-06-06 11:12:07.210 app-ios-client[260:8017] 1

2014-06-06 11:12:07.217 app-ios-client[260:8017] 2

2014-06-06 11:12:07.219 app-ios-client[260:8017] 3

2014-06-06 11:12:07.221 app-ios-client[260:8017] 4

2014-06-06 11:12:07.255 app-ios-client[260:8017] 5

2014-06-06 11:12:07.257 app-ios-client[260:8017] 6

2014-06-06 11:12:07.259 app-ios-client[260:8017] 7

2014-06-06 11:12:07.289 app-ios-client[260:8017] 8

2014-06-06 11:12:07.293 app-ios-client[260:8017] 9

2014-06-06 11:12:07.304 app-ios-client[260:8017] Before saving

2014-06-06 11:12:20.900 app-ios-client[260:8017] After saving

非常感谢!

编辑:

Here是我的仪器跟踪。

编辑2:

感谢Marcus Zarra,我发现此方法使我的应用程序运行速度太慢:
-(CGFloat)getLabelHeightForIndex:(NSInteger)index
{
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:index];

UITextView *gettingSizeLabel = [[UITextView alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:@"Helvetica" size:FONT_SIZE];
gettingSizeLabel.text = [[_fetchedResultsController objectAtIndexPath:path]body];

Message *info = [_fetchedResultsController objectAtIndexPath:path];
if ([[info contentSize]isEqualToString:@"(null)"]) {
CGSize maximumLabelSize = CGSizeMake(LABEL_WIDTH_NO_MEDIA, LABEL_TEXT_MAX_HEIGHT);

CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

if (expectedSize.height < LABEL_TEXT_MIN_HEIGHT_NO_MEDIA) {
return LABEL_TEXT_MIN_HEIGHT_NO_MEDIA;
}

return expectedSize.height;
} else {
CGSize maximumLabelSize = CGSizeMake(LABEL_WIDTH_MEDIA, LABEL_TEXT_MAX_HEIGHT);

CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

if (expectedSize.height < LABEL_TEXT_MIN_HEIGHT_MEDIA) {
return LABEL_TEXT_MIN_HEIGHT_MEDIA;
}

return expectedSize.height;
}
}

我曾经知道这种方法的高度,没有它,该应用程序的运行速度很快。我将考虑如何更改此方法以更快地工作...

非常感谢Marcus,真的!

最佳答案

这些物体有多大?您要保存多少数据?

您正在使用哪种类型的持久性存储? SQLite?

保存后,您的用户界面将如何处理这些数据?您是否正在对数据进行任何形式的解析或显示?

文书怎么说?它在哪里说花费时间?

这些是第一个问题。

核心数据以任何方式保存数据都不会花费那么长时间。我怀疑您正在用户界面中执行某些操作,而该操作实际上是由节省时间触发的。仪器中的Time Profiler会告诉我们发生了什么。

尽管我不会按照您的方式编写此代码,但是您发布的代码没有错,因此问题必须出在其他地方。仪器会告诉我们在哪里看。

更新资料

感谢您发布跟踪,它证实了我的怀疑。如果您查看花费的时间,NSFetchedResultsController中占54%,TimelineViewController中占20.6%。这意味着保存是非常很快,然后您的用户界面就对这些更改缓慢地响应非常。关闭合并更改通知以确认。从那里开始,我建议您在时间分析器中更深入地研究UI,并找出为什么它是如此之慢的原因。

看起来您正在执行一些复杂的字符串操作以及其他非常消耗CPU的事情。修复这些问题,速度将会恢复。

关于ios - 核心数据保存时间过长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24078883/

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