我现在有这个根据我是否在模拟器中触发iCloud加载。当我尝试在真实设备上运行时,我得到一个黑屏,并且'addPersistentStore'线似乎挂起。 “我的项目名称”是权利文件的名称和应用程序的名称。
发生了什么事?
#if (TARGET_IPHONE_SIMULATOR)
if (![psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:dbUrl
options:nil
error:&error]) {
[NSException raise:@"Open failed" format:@"Reason: %@", [error localizedDescription]];
}
#else
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *ubContainer = [fm URLForUbiquityContainerIdentifier:nil];
NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setObject:@"My Project Name" forKey:NSPersistentStoreUbiquitousContentNameKey];
[options setObject:ubContainer forKey:NSPersistentStoreUbiquitousContentURLKey];
if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dbUrl options:options error:&error]) {
[NSException raise:@"Open failed" format:@"%@", [error localizedDescription]];
}
#endif
答案 0 :(得分:2)
Apple建议您在使用iCloud时,应在单独的线程上执行所有这些步骤。 URLForUbiquityContainerIdentifier
和addPersistentStoreWithType:configuration:options:error:
都将连接到网络,并可能会长时间阻止。第二个调用 - 添加持久存储 - 可以阻止更长时间。在iOS上,iCloud数据仅按需下载,并且在添加持久性存储时会发生此需求。你得到一个空白屏幕因为NSPersistentStoreCoordinator
忙于与网络通话(或尝试这样做)。 Apple的示例代码将它放在一个单独的队列中,您也应该这样做。
答案 1 :(得分:0)
您的代码并未表明这一点,但您无法在主要主题上调用-URLForUbiquityContainerIdentifier
。来自Apple documentation的注意事项:
重要提示:请勿在应用的主要主题中调用此方法。 因为此方法可能需要花费大量时间来设置 iCloud并返回请求的URL,您应该始终从a中调用它 次要线程。确定iCloud是否可用,尤其是在 启动时,改为调用ubiquityIdentityToken方法。
很可能需要花费很长时间,看起来你的应用程序似乎没有加载,而实际上只是等待该方法返回。