1

我看到.NSPersistentStoreRemoteChange多次收到通知,有时多达 10 次。

我不认为这是有害的,但最好的情况是它会耗尽处理能力。

所以我的问题是:

  • 这有害吗?
  • 我可以阻止它吗?
  • 如果没有,是否有推荐的方法来忽略重复通知?

--

我有以下代码来设置我的容器。这包含在单例的初始化程序中,我已经确认它被调用过一次。

guard let modelURL = Bundle(for: type(of: self)).url(forResource: momdName, withExtension:"momd"),
            let mom = NSManagedObjectModel(contentsOf: modelURL)
            else {
                fatalError(" Error loading model from bundle")
        }
        
        let containerURL = folderToStoreDatabaseIn.appendingPathComponent("Model.sqlite")
      
            container = NSPersistentCloudKitContainer(name: momdName, managedObjectModel: mom)
            
            guard let description = container.persistentStoreDescriptions.first else {
                fatalError(" ###\(#function): Failed to retrieve a persistent store description.")
            }
            
            description.url = containerURL
            description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
            description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
              
        super.init()
        
            // this must be called after super.init()
            // ***** ADD OBSERVER *****
            NotificationCenter.default.addObserver(self,
                                                   selector: #selector(updatedFromCKCD(_:)),
                                                   name: .NSPersistentStoreRemoteChange,
                                                   object: container.persistentStoreCoordinator)
        
        if let tokenData = try? Data(contentsOf: tokenFile) {
            do {
                lastToken = try NSKeyedUnarchiver.unarchivedObject(ofClass: NSPersistentHistoryToken.self, from: tokenData)
            } catch {
                Logger.error(" ###\(#function): Failed to unarchive NSPersistentHistoryToken. Error = \(error)")
            }
        }

处理这些更改的代码:

// https://developer.apple.com/documentation/coredata/consuming_relevant_store_changes
    @objc func updatedFromCKCD(_ notifiction: Notification) {
        let fetchHistoryRequest = NSPersistentHistoryChangeRequest.fetchHistory(
            after: lastToken
        )
        
        let context = container.newBackgroundContext()
        guard
            let historyResult = try? context.execute(fetchHistoryRequest)
                as? NSPersistentHistoryResult,
            let history = historyResult.result as? [NSPersistentHistoryTransaction]
            else {
                Logger.error("⛈ Could not convert history result to transactions")
                assertionFailure()
                return
        }
        Logger.debug("⛈ Found cloud changes since: \(self.lastToken?.description ?? "nil")")
        
        DispatchQueue.main.async {
        // look for particular set of changes which require the user to take action
        ...
        }
    }
4

0 回答 0