我的iOS应用会定期使用Sync API将文件上传到Dropbox应用文件夹。当覆盖现有文件时,在恢复发生之前,一切似乎都能正常工作。
重置和恢复后(使用iTunes备份),保留了Dropbox的链接(例如https://stackoverflow.com/a/13136066/1148702),但有些事情并不恰当。覆盖Dropbox应用程序文件夹中的现有文件时,Dropbox会创建冲突的副本,但仅限于初始写入时。随后,冲突的副本没有问题。
以下是我写Dropbox并检查现有文件的方法。我已删除此代码段中的错误检查。
- (void)writeDataToDropbox:(NSData *)data inFileAtPath:(NSString *)pathString {
DBPath *path = [[DBPath root] childPath:pathString];
DBFile *file;
DBFileInfo *info = [[DBFilesystem sharedFilesystem] fileInfoForPath:path error:nil];
if (info) {
file = [[DBFilesystem sharedFilesystem] openFile:path error:nil];
} else {
file = [[DBFilesystem sharedFilesystem] createFile:path error:nil];
}
[file writeData:data error:nil];
}
有什么想法吗?
答案 0 :(得分:0)
好吧,我刚刚在ios上遇到了与Dropbox类似的情况。 通过模拟器文件,似乎当您使用Dropbox进行操作时,您实际上拥有Dropbox保留的文件和数据存储的本地镜像 - 只要该帐户链接到您的应用程序。
当您在帐户和应用之间启动链接时,镜像将空白。 似乎在镜像初始化之后,他们适当地管理在线操作(即他们知道他们是否需要使镜像数据无效,如果是,他们会适当地下载数据)。
但显然发生的是如果您在本地镜像的第一次初始化之前立即获取文件,那么它们不会将请求传递给他们的服务器,并将请求视为结果为空强>
因此,在您的情况下,我会说您在设备上本地创建了第二个副本,因为“您没有看到”现有文件在线。 当Dropbox看到两个具有相同文件名的不同文件时,冲突就会引发冲突。
一个解决方案可能会等待几秒钟,或者可能会将观察者附加到某个东西上(如果我找到了什么 - 我会更新......)
------更新------
点击此处的文档:https://www.dropbox.com/developers/sync/docs/ios#DBFilesystem
@property(nonatomic,readonly)BOOL completedFirstSync
首次链接用户的帐户时,需要使用文件系统 在可以使用之前与服务器同步。此属性表示 第一次同步是否已完成且文件系统是否已准备就绪 使用
所以我做的是在设置阶段首先检查这个属性,如果没有准备好,用“perform:selector:afterDelay”触发函数并返回。
但我实际上又需要一步 - 因为我注意到它没有正常工作。我还需要做的是在主线程上执行基本的Dropbox初始化(尽管所有的同步操作都在后台的专用线程中)