gpt4 book ai didi

iphone - 核心数据保存和 UI 性能

转载 作者:太空狗 更新时间:2023-10-30 03:59:55 24 4
gpt4 key购买 nike

我想知道在对大量托管对象进行核心数据保存(而不是提取)时,是否有任何最佳实践可以提高 UI 响应能力。

我正在开发的应用程序需要按设定的时间间隔从网络服务下载相当大量的数据,直到完成。在每个时间间隔,下载一批数据,将其格式化为托管对象,然后保存到 Core Data。因为这个过程有时可能需要长达 5 分钟才能完全完成,所以简单地添加一个加载屏幕直到一切都完成并不是一个真正的选择,它需要太长时间。我也对频繁写入 Core Data 感兴趣,而不是最后一次大写,以保持低内存占用。理想情况下,我希望用户能够继续正常使用应用程序的其余部分,同时下载这些大型数据集并将其写入 Core Data。

不幸的是,似乎正在发生的事情是,当我尝试保存我为每个批处理放入托管对象上下文中的插入内容时,保存操作会阻止用户与应用程序的其余部分进行交互(滑动表格、触摸按钮等)直到完成。对于 Core Data 保存发生的那些短时间段,应用程序非常没有响应。

自然地,我已经尝试通过减少每个间隔下载的单个批处理的大小来减少这些保存,但除了让整个过程花费更长的时间带来的不便之外,仍然会有用户的滑动不正确的情况被捕获,因为在那个特定时间发生了核心数据保存。减小尺寸只是降低了错过滑动或错过触摸的可能性,但它们似乎仍然经常发生,以至于带来不便。

对于插入本身,我尝试使用两种不同的实现:insertNewObjectForEntityForName:inManagedObjectContext 以及 setValuesForKeysWithDictionary。两者都表现出我上面描述的问题。

我尝试制作一个更简单的测试原型(prototype),以查看模拟器和设备上的性能,我在此处提供了重要元素。这个例子实际上并没有从网络上下载任何东西,而只是从 TableViewController 中按设定的时间间隔将一大堆东西写入核心数据。我很想知道是否有人对提高响应能力有任何建议。

- (void)viewDidAppear:(BOOL)animated 
{
[super viewDidAppear:animated];
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(doTimerWork:) userInfo:nil repeats:YES];
}

-(void) doTimerWork:(id)sender
{
for (int i = 0; i < 1000; i++)
{
Misc * m = (Misc*)[NSEntityDescription insertNewObjectForEntityForName:@"Misc" inManagedObjectContext:managedObjectContext];
m.someDate = [NSDate date];
m.someString = @"ASDASDASD";
m.someOtherString = @"BLAH BLAH BLAH";
m.someNumber = [NSNumber numberWithInt:5];
m.someOtherNumber = [NSNumber numberWithInt:99];
m.someOtherDate = [NSDate date];
}

NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"Experienced an error while saving to CoreData");
}
}

最佳答案

通常,您会在后台线程上下载数据,并将托管对象插入/更新到其托管对象上下文中。
在主线程上,您将注册并接收 NSManagedObjectContextWillSaveNotification 并使用 mergeChangesFromContextDidSaveNotification: 更新主托管对象上下文。

这是你在做的吗?

另请阅读 Multi Threading with Core-Data .

关于iphone - 核心数据保存和 UI 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2190473/

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