2015-12-24 46 views
0

我正在寫一個應用程序,使用iCloud文檔在不同設備之間同步數據。 我遇到的問題是,將文件從一臺設備保存到iCloud後(兩臺設備都是模擬器,註冊到同一個iCloud賬戶),該文件似乎不存在於其他設備(或需要更多超過30-40分鐘才能「到達」,而兩個模擬器都在)。強制iOS上傳文件到iCloud

我想也許有一個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 { } 
}); 

使用協調的是由於蘋果的指示,即使沒有它也不行。

當此代碼在特定設備上運行時,它將起作用 - 文件被寫入並可被讀取。 當此代碼在一臺設備上運行時,該設備會在一段時間後關閉,而其他設備稍後啓動應用程序 - 幾乎總是無法從其他設備訪問該文件。

有沒有可以強制文件上傳的命令? 你知道什麼阻止它立即上傳嗎?

我是新來的iCloud,它似乎行事不端,雖然我確信這是我做錯了什麼.. 謝謝!

回答

0

似乎只有在使用iOS模擬器時纔會出現問題。 當使用兩個實際設備時,同步在合理的時間內工作,所以我認爲這是模擬器中的一個錯誤。

此外,Apple建議本地創建的文件,在臨時庫,和文件轉移到iCloud(在上面的代碼,我在iCloud的庫最初創建的文件調用NSFileManager.defaultManager().setUbiquitous(...

希望其他人會發現它很有用,我在這個問題上燒了幾天...