gpt4 book ai didi

ios - 如何加速核心数据迁移或其他解决方案

转载 作者:行者123 更新时间:2023-11-29 03:13:16 25 4
gpt4 key购买 nike

我正在为我的 iOS 应用程序使用 Coredata。它有大约 20 个表,我的应用程序在数据库中使用了可能的图像(图像编辑应用程序)。所以数据库数据又大又重。

有一天我在一张表中添加了几列。它只是字符串列。我当然知道如何迁移和实现它,所以我添加了新的 .xcdatamodel 并更改了当前的。当我在我的设备中进行测试时,我没有遇到任何错误和冲突。所以我把它发布到iOS开发者中心,可以公布了。终于,很多用户开始更新我的应用了。

但一些用户表示“从未完成更新”。 “更新需要50分钟。”等等……
更新意味着迁移。我通过用户报告的进度确认了这一点。我不敢相信迁移需要 50 分钟!但也许这是真的。因为当我测试使用 50 张图像并保存到 CoreData 时,我的设备花了大约 1 分钟。我认为我们的客户使用 300 ~ 500 张图像和用户其他数据。如果是 iPhone4 或 iPhone4S,迁移需要很长时间...

所以我想知道如何为这些用户加速 CoreData 迁移。
现在我使用自动迁移,否则我可以选择手动迁移。
我找到了一些技巧并告诉了工程师,并收集了它,我推断手动迁移比自动迁移慢。
我正在同时寻找其他解决方案。它正在将核心数据导出到 PC。 PC 迁移而不是 iPhone。 iPhone 导入迁移的数据。有谁知道这种方法可行吗?

最后,我放上我的迁移代码。这真的很简单。

@try {
// init application (Before application:didFinishLaunchingWithOptions:)
LOG(@"start migration");

NSPersistentStoreCoordinator *migPersistent;

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[[self class] sqliteFileInDocumentsUrlString]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,nil];
NSError *error = nil;
migPersistent = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![migPersistent addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:options
error:&error]) {

NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
[migPersistent release];
return NO;
}

[migPersistent release];
LOG(@"finish migration");
}
@catch (NSException *exception) {
.....
}
@finally {
// Do Nothing
}

另外,这段代码是在MainThread上运行的。
喜欢
ViewDidAppear(LoadingWindow) -> performSelector:withObject:afterDelay -> 迁移。


感谢您收看本期,对不起我的英语口语..



编辑于 2014.02.25 21:11

我得到了跟踪文件并上传了以下 URL。
https://www.dropbox.com/sh/dmlf4j4z3vkj3p0/DrDBL_guYy

[测试流程](设备:iPodtouch 5th Gen iOS 7.0.6)
1. 插入195KB(Width:960,Height:1280) x 1000 images in previous version.
2. 安装当前版本并运行迁移。它完成了大约 11 分钟。

那为什么用户得到 50 分钟???


编辑于 2014.02.26 8:59

对不起,上面的网址是错误的。请检查此 URL。
https://www.dropbox.com/s/8xaxwyfex7gyjdt/traceFolder.zip


编辑于 2014.02.26 10:43

What is going on in -[PapeDataManager migrate]? Add the code if you can

这是上面的代码。这个方法得到了 184977x。

[migPersistent addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL
options:options error:&error]


What is going on in -[PapeDataManager repairImageNamePath]?

这个方法得到了 160775x。
[self.managedObjectContext 保存:&error]

self.managedObjectContext 是 NSManagedObjectContext。
保存似乎是繁重的过程。因为它是在迁移之后。

现在,我有一些问题。

(1) MainThread 的运行时间摘要约为 6 分钟,但在 TimeProfiler 上进程总时间为 11 分钟。为什么会出现这种差异?

(2) 当我在迁移过程中按下主页按钮时,迁移过程会死掉吗?我只是在检查它。但如果你知道这件事。请告诉我。


编辑于 2014.02.26 12:09

关于 (2)。我测试了 50 张图像迁移。
当我按下主页按钮和 30 秒后,后台任务已暂停。

所以像这样的流程
应用程序午餐 -> 加载开始 -> 迁移 -> (按下 HomeButton 并将应用程序发送到后台) -> 迁移完成 -> 后台进程暂停 -> (按下应用程序图标并将应用程序发送到前台) -> 保存 -> 加载完成

我不知道为什么应用程序在后台时加载过程不会继续。也许我们的用户对加载时间过长感到生气的原因就是这个。

最佳答案

即使持久存储中的图像似乎比自动/轻量级迁移花费的时间要长得多。

假设您现在已经构建了一个包含 500 张图像的测试用例来追踪这一点;下一步是在迁移发生时针对应用程序运行工具,看看时间都花在哪里了。如果时间确实在核心数据中(而不是发生某些 UI 事件),那么请使用 Instruments 的跟踪编辑您的帖子。

您的应用程序很可能在耗费时间的迁移之后立即尝试对数据执行某些操作。没有仪器痕迹很难辨别。

更新(从跟踪)

-[PapeDataManager migrate] 发生了什么?如果可以,请添加代码

-[PapeDataManager RepairImageNamePath] 发生了什么?

-repairImageNamePath 花费了最多的时间,如果您能解决这个问题,您将看到性能的显着提升。

更新2

开启 SQLite debug会让你看到在这段时间里发生了什么。如果由于商店中的 blob 而导致大量的 sql 调用,那么您将需要重构您的商店,可能需要进行手动迁移(不重,但从 Core Data 导出并重建文件)来解决这个问题。

关于ios - 如何加速核心数据迁移或其他解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21989587/

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