【问题标题】:CoreData+iCloud in iOS8 with Xcode6 and SwiftiOS8 中的 CoreData+iCloud 与 Xcode6 和 Swift
【发布时间】:2015-03-15 18:16:56
【问题描述】:

我已经阅读了很多 CoreData+iCloud 并了解它的任何内容,但并不简单。但是,我很早就被卡住了,想知道你们是否有任何想法。

我的工作台: Xcode6.1.1、Swift、CoreData 添加了 iCloud 权利(在 iOS8.1 模拟器和 iOS8.1 设备上测试)

要亲自查看,只需在 Xcode 中启动一个新的“Singe View Application”项目,选中“Use Core Data”复选框。为了启用 iCloud,我添加了

let storeOptions = [
    NSPersistentStoreUbiquitousContentNameKey: "iCloudTest"
]

在调用coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration:URL:options:error:)之前

我还为NSPersistentStoreCoordinatorStoresWillChangeNotificationNSPersistentStoreCoordinatorStoresDidChangeNotificationNSPersistentStoreDidImportUbiquitousContentChangesNotification 添加了观察者。

当我第一次运行应用程序时,我的控制台输出如下所示:

storesDidChange: NSConcreteNotification 0x15d6b890 {name = NSPersistentStoreCoordinatorStoresDidChangeNotification; object = <NSPersistentStoreCoordinator: 0x15e96380>; userInfo = {
added =     (
    "<NSSQLCore: 0x15e9a1b0> (URL: file:///var/mobile/Containers/Data/Application/F2E684E6-6B7B-4429-B9CD-24C45DE18D27/Documents/CoreDataUbiquitySupport/mobile~BB56F5F3-5448-41A3-A142-921D99A85855/iCloudTest/1660860A-83E1-4906-BEB8-DAF02DAC62B0/store/iCloudTest.sqlite)"
     );
}}
2015-01-16 22:17:51.367 iCloudTest[783:414835] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](808): CoreData: Ubiquity:  mobile~BB56F5F3-5448-41A3-A142-921D99A85855:iCloudTest
Using local storage: 1
managedObjectContext: Optional(<NSManagedObjectContext: 0x15d69340>)
2015-01-16 22:17:51.815 iCloudTest[783:414857] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](808): CoreData: Ubiquity:  mobile~BB56F5F3-5448-41A3-A142-921D99A85855:iCloudTest
Using local storage: 0

正如Design for iCloud Programming Guide 的检查点中所述,我应该看到Using local store: 1,然后在Using local storage: 0 之后不久(大约1-5 秒)。到目前为止,一切都很好。我很高兴。

现在,无需更改一行代码,只需重新运行应用程序,就会导致以下日志输出:

 storesDidChange: NSConcreteNotification 0x166606f0 {name = NSPersistentStoreCoordinatorStoresDidChangeNotification; object = <NSPersistentStoreCoordinator: 0x165485b0>; userInfo = {
added =     (
    "<NSSQLCore: 0x1658dfb0> (URL: file:///var/mobile/Containers/Data/Application/A742A53E-6785-40AC-A21A-16D4BB5F332E/Documents/CoreDataUbiquitySupport/mobile~9CB93B5A-F976-4AB8-B1B3-290F18DE796A/iCloudTest/0A12A44B-599B-49DD-8AD8-546EFD4E26DC/store/iCloudTest.sqlite)"
    );
}}
2015-01-16 22:08:55.133 iCloudTest[770:412842] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](808): CoreData: Ubiquity:  mobile~9CB93B5A-F976-4AB8-B1B3-290F18DE796A:iCloudTest
Using local storage: 1
managedObjectContext: Optional(<NSManagedObjectContext: 0x1658f2e0>)
2015-01-16 22:11:29.005 iCloudTest[770:412855] -[PFUbiquitySafeSaveFile waitForFileToDownload:](489): CoreData: Ubiquity:  <PFUbiquityBaseline: 0x165a5950>(0)
    permanentLocation: <PFUbiquityLocation: 0x165a6690>: /var/mobile/Library/Mobile Documents/iCloud~com~mycompany~iCloudTest/CoreData/iCloudTest/.baseline/iCloudTest/47DEQpj8HBSa~_TImW~5JCeuQeRkm5NMpJWZG3hSuFU=/baseline.zip
    safeLocation: <PFUbiquityLocation: 0x165a5ac0>: /var/mobile/Library/Mobile Documents/iCloud~com~mycompany~iCloudTest/CoreData/iCloudTest/.baseline/iCloudTest/47DEQpj8HBSa~_TImW~5JCeuQeRkm5NMpJWZG3hSuFU=/mobile~9CB93B5A-F976-4AB8-B1B3-290F18DE796A
    currentLocation: <PFUbiquityLocation: 0x165a6690>: /var/mobile/Library/Mobile Documents/iCloud~com~mycompany~iCloudTest/CoreData/iCloudTest/.baseline/iCloudTest/47DEQpj8HBSa~_TImW~5JCeuQeRkm5NMpJWZG3hSuFU=/baseline.zip

    storeName: iCloudTest
    modelVersionHash: 47DEQpj8HBSa~_TImW~5JCeuQeRkm5NMpJWZG3hSuFU=
    baselineArchiveLocation: <PFUbiquityLocation: 0x165a6690>: /var/mobile/Library/Mobile Documents/iCloud~com~mycompany~iCloudTest/CoreData/iCloudTest/.baseline/iCloudTest/47DEQpj8HBSa~_TImW~5JCeuQeRkm5NMpJWZG3hSuFU=/baseline.zip

Download failed for file, error: Error Domain=NSCocoaErrorDomain Code=512 "The file download timed out." UserInfo=0x16670090 {NSLocalizedDescription=The file download timed out.}
2015-01-16 22:11:29.009 iCloudTest[770:412855] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](808): CoreData: Ubiquity:  mobile~9CB93B5A-F976-4AB8-B1B3-290F18DE796A:iCloudTest
Using local storage: 0

突然间,iCloud 开始行动了!我在 Using local storage: 1Using local storage 0 之间计时了大约 90 秒。

这有什么好担心的吗?我担心如果同步对我的用户来说需要那么长时间,这将是一个非常糟糕的体验(想想使用一个应用程序 1 分钟以上,突然 iCloud 内容弹出......)我想因为Using local storage 0 最终会触发,启用 iCloud 同步?但是,调试导航器中的 iCloud 报告显示 Status: iCloud not configured

我做错了吗?

PS:这是直接的苹果样板,只有额外的代码来添加 iCloud 权利。

【问题讨论】:

    标签: ios xcode swift core-data icloud


    【解决方案1】:

    这没什么好担心的。与 iCloud 同步本质上是异步的并且容易发生故障(就像您处于飞行模式一样)。最终本地版本和 iCloud 版本会同步,您需要处理一些相同记录发生冲突的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 2014-11-13
      • 1970-01-01
      相关资源
      最近更新 更多