Dim*_*lov 5 macos core-data ios icloud swift
我无法处理这个问题,我正在尝试将 iCloud 和 Core Data 集成到我的应用程序中,但我坚持使用 iCloud 同步部分。
我的完整场景:
如果我们去掉关于迁移的讨论并专注于使用 iCloud 加载持久存储协调器,我认为问题与
NSPersistentStoreCoordinatorStoresDidChangeNotification事件有关。
我就是不明白。在我阅读的每篇文章中,我都看到了类似的内容:“在此处重新加载您的 UI”。但这对我不起作用。
重载协调器功能
func configureContext() -> NSManagedObjectContext? {
// Create the coordinator and context
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
//remove all observers from "previous" coordinator
deregisterForStoreChanges()
//and register them for new one
registerObservers(persistentStoreCoordinator: coordinator)
do {
//storeSettings.url = applicationDocumentsDirectory.URLByAppendingPathComponent("iCloud.sqlite")
//storeSettings.options = [NSPersistentStoreUbiquitousContentNameKey:"iCloudProject"]
try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeSettings.url, options: storeSettings.options)
} catch {
//Here was standard error handler I didn't changed it, but removed for listing
abort()
}
persistentStoreCoordinator = coordinator
let managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
//not quite sure about the next string, didn't test it yet
managedObjectContext.mergePolicy = NSMergePolicy(mergeType:NSMergePolicyType.MergeByPropertyStoreTrumpMergePolicyType )
//tried to refetch my records here but, with no luck.
//refetchUIRecords()
return managedObjectContext
}
Run Code Online (Sandbox Code Playgroud)
我的NSPersistentStoreCoordinatorStoresDidChangeNotification事件功能
func persistentStoreCoordinatorDidChangeStores(notification:NSNotification){
if notification.userInfo?[NSAddedPersistentStoresKey] != nil {
print("-----------------------")
print("ADDED")
print("-----------------------")
//deduplicateRecords()
//if iCloud -> refetch UI
if NSUserDefaults.standardUserDefaults().boolForKey("iCloud"){
self.createTimer()
}
}
print("Did Change")
}
Run Code Online (Sandbox Code Playgroud)
创建计时器功能只是一个在实际重新获取和刷新 UI 之前等待 1 秒的功能。
问题
当我们从我的场景到达第 4 步并调用 configureContext 函数时,我在控制台中看到:
2016-04-12 13:31:27.749 TestingiCloudProject[2052:1142902] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](898): CoreData: Ubiquity: mobile~567404C0-9D84-4C07-A0F8-D25832CB65D8:iCloudProject
Using local storage: 1 for new NSFileManager current token <ef7a917f bca47ecf 5d58862d cbe9998d 7e53e5ea>
Did Change
Did Change
-----------------------
ADDED
-----------------------
Timer
Did Change
Refetch
Refetching...
Number of records after fetch: 1 //must be more than 1
2016-04-12 13:31:30.090 TestingiCloudProject[2052:1143055] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](898): CoreData: Ubiquity: mobile~567404C0-9D84-4C07-A0F8-D25832CB65D8:iCloudProject
Using local storage: 0 for new NSFileManager current token <ef7a917f bca47ecf 5d58862d cbe9998d 7e53e5ea>
Run Code Online (Sandbox Code Playgroud)
如您所见,我的提取请求之前执行过Using local storage: 0,这就是为什么我从本地存储(1 条记录)而不是 iCloud(包含 1 条以上)接收记录的原因。
我不明白什么时候重新获取我的记录。我从这个重要来源中获取计时器部分,供所有想要了解更多有关 Core Data 和 iCloud 的人使用。但是,1 秒是不够的,2 秒是我想要的工作,但是如果 iCloud 商店比我的大,或者网络连接比我的差,我认为计时器不是办法。
我希望有人已经面临这个微不足道的问题。
编辑
我没有从 Apple 开发论坛和 SO 找到任何帮助,所以我激活了我的代码技术支持令牌,我希望他们能帮助我。一旦我解决了我的问题,我就会写一个答案。但是,如果您阅读了这个问题,知道可能的答案,请立即发布。
NSPersistentStoreDidImportUbiquitousContentChangesNotification每当从无处不在的内容存储导入数据时,持久存储协调器就会触发另一个通知。在这里您可以将更改与 NSManagedObjectContext 合并。
\n\n\n\n当 ubiquity 容器收到来自 iCloud 的更改时,Core Data 会发布 NSPersistentStoreDidImportUbiquitousContentChangesNotification 通知。此通知\xe2\x80\x99s userInfo 字典的结构与 NSManagedObjectContextDidSaveNotification 通知的结构类似,只是它包含 NSManagedObjectID 实例而不是 NSManagedObject 实例。因此,您可以合并来自其他对等点的更改,就像合并来自其他托管对象上下文的更改一样。在托管对象上下文中调用 mergeChangesFromContextDidSaveNotification: ,传入 Core Data 发布的通知对象。
\n
| 归档时间: |
|
| 查看次数: |
1215 次 |
| 最近记录: |