gpt4 book ai didi

iOS 核心数据迁移超时

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:14:19 25 4
gpt4 key购买 nike

我在 Xcode 管理器中收到此错误消息(以及随后的崩溃),我怀疑它与完成时间太长的核心数据迁移有关:

Oct 4 09:51:14 unknown SpringBoard[30] : appName failed to launch in time

此迁移在模拟器中有效,即使我插入人为延迟(例如使用 sleep(100))也是如此。

只有当我尝试在 iPhone 4 或 iPod 第 4 代上进行测试时,我才会收到此超时错误消息。

如果不需要迁移,通过在构建期间提供正确的 sqlite3 数据库版本,不会发生崩溃。

这是代码中发生的事情:

在应用委托(delegate)中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

PropertiesTableViewController *propertiesTableViewController =
[[PropertiesTableViewController alloc] initWithManagedObjectContext:self.managedObjectContext];

UINavigationController *newNavController =
[[UINavigationController alloc]
initWithRootViewController:propertiesTableViewController];


[propertiesTableViewController release];
[window addSubview:newNavController.view];


NSLog(@"UUID: %@", [[UIDevice currentDevice] uniqueIdentifier]);

[window makeKeyAndVisible];

return YES;
}


- (NSManagedObjectContext *) managedObjectContext {

if (managedObjectContext != nil) {
return managedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}`

persistentStoreCoordinator 是一个相当长的方法,很乐意在需要时提供它。它迁移两个数据库,每个大约 500kBytes。第一个总是成功,但第二个总是失败(在设备上),但是两者总是在模拟器中成功。 propertiesTableViewController 提供一个 TableView ,其中包含从迁移的数据库中获取的数据,因此迁移必须在 propertiesTableViewController 开始查看之前发生。

我还尝试尝试使用以下方法从 propertiesTableViewController 内部(在 viewDidLoad 方法中)触发迁移:

  • [NSThread detachNewThreadSelector:@selector(getMOC) toTarget:self withObject:nil] --> 由于 TableView 无法访问托管对象上下文而崩溃,因为迁移仍在进行中,该上下文尚未准备好。
  • [self performSelectorOnMainThread:@selector(getMOC) withObject:nil waitUntilDone:YES]; --> 因相同的超时错误而崩溃

getMOC 方法是这样的:

-(void)getMOC
{
NSAutoreleasePool *autoreleasePoolProperty = [[NSAutoreleasePool alloc] init];
NSLog(@"getting appDelegate from PropertiesTableViewController");

iNspectorAppDelegate *appDelegate = (iNspectorAppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog(@"getting managedObjectContext from PropertiesTableViewController");
self.managedObjectContext = [appDelegate managedObjectContext];
NSLog(@"got managedObjectContext from PropertiesTableViewController");
[autoreleasePoolProperty release];
[self performSelectorOnMainThread:@selector(finishedGettingPropertyData) withObject:nil waitUntilDone:NO];
}

最佳答案

我认为您需要推迟显示导航 Controller 直到迁移完成,即您可能需要显示“进度 Controller ”。

最简单的方法可能是在启动时显示进度 Controller :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
...
[window addSubview:progressController.view];
[window makeKeyAndVisible];
[self performSelectorInBackground:@selector(loadPersistentStore) withObject:nil];
}

-(void)loadPersistentStore
{
[self persistentStoreCoordinator];
[self performSelectorOnMainThread:@selector(persistentStoreLoaded) withObject:nil waitUntilDone:NO];`
}

-(void)persistentStoreLoaded
{
[progressController.view removeFromSuperview];
self.progressController = nil;

// Load the normal VC here
...
}

一个稍微好一点的选择是首先尝试在关闭 NSMigratePersistentStoresAutomaticallyOption 的情况下加载持久存储。如果失败,则显示进度VC并在后台重试;如果成功,则可以直接显示普通 VC(在上面的代码中,您可以直接从 -application:didFinishLaunchingWithOptions: 调用 -persistentStoreLoaded)。

关于iOS 核心数据迁移超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641742/

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