0

我现在有这个可以根据我是否在模拟器中触发 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
4

2 回答 2

2

Apple 建议您在使用 iCloud 时,应在单独的线程上执行所有这些步骤。两者都URLForUbiquityContainerIdentifieraddPersistentStoreWithType:configuration:options:error:连接到网络,并且可能会长时间阻塞。第二个调用——添加持久存储——可能会阻塞更长的时间。在 iOS 上,iCloud 数据仅按需下载,并且当您添加持久存储时会发生这种需求。NSPersistentStoreCoordinator由于正忙于与网络交谈(或试图这样做),您得到一个空白屏幕。Apple 的示例代码将其放在一个单独的队列中,您也应该这样做。

于 2013-06-03T22:59:17.290 回答
0

您的代码没有表明这一点,但您不能-URLForUbiquityContainerIdentifier在主线程上调用。Apple文档中的注释:

重要提示:不要从应用程序的主线程调用此方法。由于此方法可能需要大量时间来设置 iCloud 并返回请求的 URL,因此您应该始终从辅助线程调用它。要确定 iCloud 是否可用,尤其是在启动时,请改为调用 ubiquityIdentityToken 方法。

很可能它需要很长时间并且看起来好像您的应用程序没有加载,而实际上它只是在等待该方法返回。

于 2013-06-03T19:55:15.250 回答