Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 当iCloud不是';t启用?_Iphone_Objective C_Ios_Core Data_Icloud - Fatal编程技术网

Iphone 当iCloud不是';t启用?

Iphone 当iCloud不是';t启用?,iphone,objective-c,ios,core-data,icloud,Iphone,Objective C,Ios,Core Data,Icloud,我希望用户能够在禁用iCloud时继续正常使用核心数据存储。我遇到的唯一问题是,他们可能有很多数据,这些数据在启用时生成日志,如果他们再次启用,我要么不添加他们自那时以来生成的所有数据,要么添加所有数据,从而复制现有数据。为了避免这个问题,我想在iCloud被禁用时继续创建日志,这样它就可以在再次启用时上传这些更改 这是连接到iCloud时必须执行的代码: NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil];

我希望用户能够在禁用iCloud时继续正常使用核心数据存储。我遇到的唯一问题是,他们可能有很多数据,这些数据在启用时生成日志,如果他们再次启用,我要么不添加他们自那时以来生成的所有数据,要么添加所有数据,从而复制现有数据。为了避免这个问题,我想在iCloud被禁用时继续创建日志,这样它就可以在再次启用时上传这些更改

这是连接到iCloud时必须执行的代码:

NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil];

NSURL *iCloudLogsPath = [NSURL fileURLWithPath:[[iCloud path] stringByAppendingPathComponent:iCloudLogsDirectoryName]];

NSMutableDictionary *options = [NSMutableDictionary dictionary];
        [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
        [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
        [options setObject:iCloudEnabledAppID            forKey:NSPersistentStoreUbiquitousContentNameKey];
        [options setObject:iCloudLogsPath                forKey:NSPersistentStoreUbiquitousContentURLKey];

[psc addPersistentStoreWithType:NSSQLiteStoreType
                          configuration:nil
                                    URL:store
                                options:options
                                  error:nil];

不幸的是,这不是一个选择。启用iCloud并使用
NSPersistentStoreUbiquitousContentNameKey
时,将自动创建核心数据事务日志。在其他情况下,不会创建任何事务日志。在没有启用iCloud的情况下,代码无法强制创建日志。在尝试将iCloud与核心数据一起使用时,这种情况只是许多意外的复杂情况之一

一种可能的方法是:当您发现iCloud已经启用时,将您的整个数据存储迁移到iCloud,而不必担心是否已经存在任何内容。然后,使用重复检测方法删除重复条目。苹果公司在其
SharedCodeData
示例项目中提供了重复检测代码的一个很好的例子,该项目在2012年WWDC第227次会议中介绍,使用iCloud和核心数据

另一种方法是在禁用iCloud时维护自己的更改日志。使用
NSManagedObjectContextDidSaveNotification
监视更改,并保留您自己在禁用iCloud时更改的对象列表。如果重新启用iCloud,则可以重新保存这些对象以生成iCloud事务

然而,无论是哪种情况,都有一些相关的复杂因素需要考虑:

  • 如果用户在应用程序运行时禁用iCloud,则您无法继续使用现有的永久存储协调器,甚至无法继续使用现有的数据存储。如果您这样做,您的应用程序将尝试写入事务日志,失败是因为没有地方放置它们,然后崩溃。您需要转移到一个新的非iCloud数据存储区。您可能可以使用
    migratePersistentStore:toURL:options:withType:error:
    一步完成此操作,但您必须这样做。(顺便说一句,可能会弄乱数据存储的元数据,但这是未记录的,我不知道要删除哪些密钥)

  • 与上述相关,如果用户重新启用iCloud,则需要迁移回启用iCloud的数据存储

  • 如果在应用程序启动时未启用iCloud,则在设置持久存储协调器时,您应该使用
    nil
    作为选项。检查
    URLForUbiquityContainerIdentifier:
    返回的值,并相应地使用或不使用iCloud继续操作

  • 根据我的经验——iCloud的核心数据是不稳定的。除其他事项外,一定要检查
    addPersistentStoreWithType:etc
    的返回值,因为它可能会因为没有明显的原因而失败(即,您做的一切都是正确的,但iCloud没有正常运行)


  • 祝你好运,你会需要它的。请记住,到今天为止,即使是苹果公司也没有在自己的任何应用程序中使用iCloud核心数据。

    我建议你在苹果私人论坛上发布这篇文章-我在那里看到了很多关于这类问题的问题,不幸的是,没有太多答案。如果没有任何回应,烧掉一个DTS事件(一年两次)并从苹果那里得到真正的帮助。当你说“日志”时,你指的是核心数据在使用iCloud时创建的事务日志吗?@TomHarrington正确。有没有可能在没有启用iCloud的情况下创建这些内容?我不知道为什么这会被否决,这完全是准确的,而且是基于我自己使用iCloud的经验。