Core Data + iCloud Sync确实更改了商店通知不刷新UI

时间:2016-04-12 11:42:37

标签: ios swift macos core-data icloud

我无法处理这个问题,我正在尝试将iCloud和Core Data集成到我的应用程序中,并且我坚持使用iCloud同步部分。

我的完整情景:

  1. 本地核心数据存储以初始数据播种
  2. 稍后该应用会询问用户有关iCloud或本地数据存储的信息
  3. 如果用户选择iCloud,则当前本地存储将迁移到iCloud商店
  4. 迁移后,将使用iCloud Store重新加载上下文和持久性存储协调器
  5. 从新上下文中重新获取数据(此处为麻烦)
  6. 如果我们拿走有关迁移的讨论并专注于使用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
    }
    

    我的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")
    
    }
    

    创建计时器功能只是在实际重新获取和刷新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>
    

    正如您所见,我的获取请求在Using local storage: 0之前执行,这就是为什么我从本地存储(1条记录)收到记录而不是iCloud(包含1条以上)的记录。

    我不明白何时重新获取我的记录。对于想要了解Core Data和iCloud的所有人,我从这个great source获取计时器部分。 但是,1秒钟没有投入,2秒就是我想要的工作,但是如果iCloud商店比我的要大,或者网络连接会比我的更糟,我不认为计时器就是这样。

    我希望有人已经面临这个微不足道的问题。

    修改

    我没有从Apple dev论坛找到任何帮助,所以我激活了我的代码技术支持令牌,我希望他们可以帮助我。一旦我解决了我的问题,我就会写一个答案。但是,如果您读过这个问题的人知道可能的答案,请立即发布。

1 个答案:

答案 0 :(得分:0)

每当从无处不在的内容存储库导入数据时,持久性存储协调器会触发另一个通知{{1}}。在这里,您可以将更改与NSManagedObjectContext合并。

  

当ubiquity容器收到来自iCloud的更改时,Core Data会发布NSPersistentStoreDidImportUbiquitousContentChangesNotification通知。此通知的userInfo字典的结构类似于NSManagedObjectContextDidSaveNotification通知的结构,除了它包含NSManagedObjectID实例而不是NSManagedObject实例。因此,您可以以与合并其他托管对象上下文的更改相同的方式合并来自其他对等方的更改。在您的托管对象上下文中调用mergeChangesFromContextDidSaveNotification:传入Core Data发布的通知对象。

https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/UsingCoreDataWithiCloudPG/UsingSQLiteStoragewithiCloud/UsingSQLiteStoragewithiCloud.html