我正在编写一个应用程序,使用iCloud文档在不同设备之间同步数据。 我遇到的问题是,在从一台设备将文件保存到iCloud之后(这两种设备都是模拟器,注册到同一个iCloud帐户),该文件似乎不存在于其他设备上(或者需要超过30-40分钟到达"到达",两个模拟器都打开了。
我想也许有一个强制文件同步的API,但似乎没有这样的API(在NSFileManager
上)。
我用来编写文件的代码是(我只上传了相关的代码):
currVersionDir = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier(nil)?.URLByAppendingPathComponent(DBVersionURL, isDirectory: false);
if (!NSFileManager.defaultManager().fileExistsAtPath((currVersionDir?.path)!))
{
NSFileManager.defaultManager().createFileAtPath((currVersionDir?.path!)!, contents: nil, attributes: nil);
}
let coord = NSFileCoordinator();
let err : NSErrorPointer = NSErrorPointer();
coord.coordinateWritingItemAtURL(currVersionDir!, options: .ForMerging, error: err, byAccessor: {(url : NSURL) in
do {
try dbVersion.writeToFile(currVersionDir!.path!, atomically: true, encoding: NSUTF8StringEncoding);
} catch { retVal = false; }
});
用于读取文件的代码:
let coord = NSFileCoordinator();
let err : NSErrorPointer = NSErrorPointer();
do{
if (currDir != nil && isOnIcloud){
try NSFileManager.defaultManager().startDownloadingUbiquitousItemAtURL(currDir!);
}
} catch { }
coord.coordinateReadingItemAtURL(currVersionDir!, options: .WithoutChanges, error: err, byAccessor: {(url : NSURL) in
do {
currDbVersion = try NSString(contentsOfFile: currVersionDir!.path!, encoding: NSUTF8StringEncoding) as String;
} catch { }
});
协调员的使用是因为Apple的指示,即使没有它也不起作用。
当此代码在特定设备上运行时,它可以正常工作 - 文件已写入,可以读取。 当此代码在一台设备上运行时,设备会在一段时间后关闭,而另一台设备稍后会启动该应用程序 - 几乎总是无法从其他设备访问该文件。
是否有任何可以强制上传文件的命令? 你知道是什么阻止它立即上传吗?
我是iCloud的新手,似乎行为不端,而我确定这是我做错的事情。 谢谢!
答案 0 :(得分:0)
似乎问题只在使用iOS模拟器时才会发生。 当使用两个实际设备时,同步在合理的时间内工作,所以我认为这是模拟器中的一个错误。
此外,Apple建议在本地创建文件,在临时库中,并调用NSFileManager.defaultManager().setUbiquitous(...
将文件移动到iCloud(在上面的代码中,我最初在iCloud库上创建文件。
希望其他人会发现它有用,我在这个问题上烧了几天......