相关疑难解决方法(0)

iCloud NSUbiquitousKeyValueStore初始同步/访问延迟 - 如何处理?

我正在使用NSUbiquitousKeyValueStore来存储一些应用程序设置.我的逻辑是:当我在本地保存数据时,我还将其保存到NSUbiquitousKeyValueStore作为备份.当我需要设置时,我在本地阅读,如果没有在本地找到数据,我只使用iCloud键值存储(例如,在重新安装应用程序之后).如果用户有多个设备共享一个icloud id,他可以在一个设备上写设置并将其下载到另一个设备(我警告他重写).

我有一个奇怪的问题.脚步:

  1. 安装应用程序并将其数据保存到NSUbiquitousKeyValueStore.确保数据存在.
  2. 删除了应用程序(假设数据仍然存在于iCloud中).
  3. 等待几分钟以防万一,然后安装并从Xcode内部启动应用程序.
  4. 尝试使用[[NSUbiquitousKeyValueStore defaultStore] dataForKey:@"mykeyname"读取设置键 - 有时它没问题,但有时候找不到密钥!
  5. 等了15秒,又试了一次.成功.困惑.

因此,似乎ios需要一些时间来为我的应用程序提供远程键值存储,以便在dataForKey:call中进行本地访问.如果我写了这样一个系统(实际上我做过 - 前一段时间,在另一个生命中),在询问和接收键值数据之前显然必须有一个延迟.所以我想要一些通知说:"我们在第一次启动时完成了下载/同步键值存储"或类似的东西.

据我所知,我可以同步在主线程中使用NSUbiquitousKeyValueStore(这对我来说很方便).但是[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]返回一个有效的url,然后我得到"key not found".所以我不能依赖它.有没有办法确保下载NSUbiquitousKeyValueStore的工作原理?这一点非常重要,特别是在网速较慢时.

UPDATE

添加[[NSUbiquitousKeyValueStore defaultStore] synchronize](如在apple docs中所写)到init和load有点帮助.iCloud还有很多问题.

昨天我已成功将数据保存到手机1上的键值存储区并在手机2上恢复.今天我已删除手机2上的应用程序并尝试恢复数据.但即使[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]返回有效的URL我调用[[NSUbiquitousKeyValueStore defaultStore] synchronize]我在调用dataForKey:MY_DATA_KEY时得到nil.

当我尝试从手机1上的icloud恢复数据(应用程序仍然安装)时,它成功,但是当我在此手机上重新安装时,应用程序恢复不再成功.

临时解决方案是:"关闭iCloud->文档和数据 - 关闭和打开网络 - 打开文档和数据",但是你应该等几分钟,然后它应该工作.

所以,问题:1.你对iCloud有这样的问题吗?2.有没有办法找出数据不可用或尚未下载?3. iCloud有任何已知的"延迟"吗?我听说大约7秒钟,但显然不是这样.4.似乎当应用程序没有未加载时,iCloud数据的更新速度非常快(秒),但是当您重新安装应用程序时,icloud需要几分钟才能实现键值存储.有没有办法强迫这个过程?


PS 下面是我的CloudHelper供你参考 - 非常简单的c ++类,用于向/从iCloud键值存储写入/读取二进制数据.这是不可编译的,我已经适应它,以便更清楚 - 删除我的引擎相关的代码.如果你删除MySystem :: ...调用它仍然很好.除了我之前提到的.

class CloudHelper
{
public:
    static bool init();
    static void deInit();
    //save our data to iCloud with
    static int saveData(unsigned char* data, int from, int count);
    //get our data from iCloud
    static unsigned char …
Run Code Online (Sandbox Code Playgroud)

iphone ios icloud-api nsubiquitouskeyvaluestore

13
推荐指数
1
解决办法
5707
查看次数