2014-03-25 23 views
1

我的iOS應用程序使用他們的Sync API定期將文件上傳到Dropbox應用程序文件夾。覆蓋現有文件時,一切似乎都正常工作,直到發生還原。Dropbox iOS SDK在還原後不必要地創建衝突副本

重置和恢復(使用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

看起來您的設備恢復正在恢復Sync SDK中緩存/元數據的舊狀態,因此當您再次寫入數據時,實際上是在舊版本上「上傳」,導致衝突。如果你想確保你使用的是最新版本,你需要註冊一個觀察者,等待所有新的刪除更改先下載,然後再更新,然後再編寫任何其他本地更改。 – Greg

+0

@Greg謝謝你的提示。我認爲緩存/元數據的「舊狀態」實際上並不舊。爲了測試這種情況,我正在烘烤,重置並在短時間內恢復所有內容。無論如何:我不確定你的解決步驟實際上意味着什麼。什麼是「新的刪除更改」?我如何註冊觀察員觀察這些?我如何要求Sync SDK進行更新?我希望這在文檔中更清楚: - /(也許我只是錯過了一些明顯的東西!) –

+0

對不起,這應該是說「新的遠程更改」。本教程的這一部分涵蓋了觀察者和更新:https://www.dropbox.com/developers/sync/start/ios#observers此外,請查看SDK附帶的示例應用程序,以查看它的所有實際操作。 – Greg

回答

0

嗯,我剛剛遇到與ios上的Dropbox類似的情況。 通過模擬器文件,似乎當您使用Dropbox進行操作時,您實際上擁有Dropbox保留的文件和數據存儲的本地鏡像 - 只要該帳戶與您的應用相關聯即可。

當您啓動帳戶和應用程序之間的鏈接時,鏡像將從空白處開始。 看起來,在鏡像初始化之後,他們適當地管理在線操作(即他們知道他們是否需要使鏡像數據無效,如果是的話,他們會適當地下載數據)。

但是很明顯的情況是,如果立即本地鏡像的第一初始化之前獲取文件,那麼就不用請求傳給服務器,彷彿結果爲空治療的請求。

所以在你的情況下,我想說你在設備上本地創建了第二個副本,因爲「你沒有看到」有一個現有的在線文件。 當Dropbox看到兩個具有相同文件名的不同文件時,衝突引起了後遺症。

一個解決方案可能是等待幾秒鐘,或者也許觀察員附加的東西(如果我會找到什麼 - 我會更新...)

------更新 - -----

退房的文檔在這裏:https://www.dropbox.com/developers/sync/docs/ios#DBFilesystem

@屬性(非原子,只讀)BOOL completedFirstSync

當使用r的帳戶是第一個鏈接,文件系統需要 與服務器同步,纔可以使用。此屬性表示 第一個同步是否已完成,並且文件系統已準備好使用 。

所以我所做的就是檢查設置階段的第一件事,如果這個屬性沒有準備好,用「perform:selector:afterDelay」觸發函數並返回。

但我實際上需要多一步 - 因爲我發現它不能正常工作。此外我需要做的是在主線程上執行基本的Dropbox初始化(儘管所有的同步操作都在後臺的專用線程中)