NSNotification NSMetadataQueryDidUpdate 获取不间断的通知消息

Posted

技术标签:

【中文标题】NSNotification NSMetadataQueryDidUpdate 获取不间断的通知消息【英文标题】:NSNotification NSMetadataQueryDidUpdate getting non-stop Notification messages 【发布时间】:2017-12-04 18:52:34 【问题描述】:

我正在我的应用程序中实现保存到 iCloud Drive。现在我正在模拟器上测试应用程序。我可以将文件保存到 iCloud Drive,它会按预期显示在驱动器上。在我的代码中,我实现了 NotificationCenter.default.addObserver。应用程序激活时调用 startQuery()。这是代码示例:

@objc func startQuery()

    stopQuery()
    query = documentQuery()
    print( "adding notifications" )
    NotificationCenter.default.addObserver(self, selector: #selector(finishGatheringNotification(notifciations:)), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object:nil )
    NotificationCenter.default.addObserver(self, selector: #selector(didUpdateNotification(notifciations:)), name: NSNotification.Name.NSMetadataQueryDidUpdate, object:nil )
    query?.start()


@objc func stopQuery()

    guard let query = self.query else
        return
    
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object:nil )
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.NSMetadataQueryDidUpdate, object:nil )
    query.stop()
    self.query = nil



     @objc func finishGatheringNotification( notifciations:NSNotification )
        print( "called finished gathering notification" )
        processICloudFiles(notifciations: notifciations )
    

    @objc func didUpdateNotification( notifciations:NSNotification )
        // This seems to be getting called non-stop
        print( "called updated notification" )
        processICloudFiles(notifciations: notifciations )
    

    @objc func processICloudFiles( notifciations:NSNotification )
    
        guard let query = query else
            return
        
        query.disableUpdates()
        var metaDataItems:[NSMetadataItem] = []

        if let queryResults = query.results as? [NSMetadataItem]
            print( "query results:\(queryResults.count)")
            for result in queryResults
                if let fileURL = result.value(forAttribute: NSMetadataItemURLKey ) as? NSURL
                     print( "file found in iCloud:\(String(describing: fileURL.lastPathComponent))")
                    metaDataItems.append( result )
                
            
            if metaDataItems.count > 0
                updateICloudFiles(metaDataItems: metaDataItems)
            
        
        query.enableUpdates()
    

但是,NSMetadataQueryDidUpdate 的选择器被称为 no stop。我认为它只是在 iCloud 磁盘的内容发生变化时才会被调用。 任何建议。 谢谢 雷扎

【问题讨论】:

它可以更新对象以响应通知吗?您能否创建一个重现该问题的最小示例? 我更新了我的代码,增加了一些细节。很难有一个完整的例子,因为它与 iCloud 存储等相关。 这方面有什么更新吗?我正在使用 iCloud Drive,并希望收到通知以检测冲突。到目前为止,我根本没有接到任何观察员的电话。我正在观察 NSNotification.Name.NSMetadataQueryDidUpdate 和 NSNotification.Name.UIDocumentStateChanged。 【参考方案1】:

尝试取消初始化:

deinit 
    NotificationCenter.default.removeObserver(self)

【讨论】:

据我了解,您需要激活通知,以便在 iCloud UbiquitousDocuments 文件夹的内容更新时通知您,以便您的应用能够做出适当的响应。【参考方案2】:

刚刚收到来自 Apple 的消息,这是一个已知错误,我已发布错误报告。

【讨论】:

以上是关于NSNotification NSMetadataQueryDidUpdate 获取不间断的通知消息的主要内容,如果未能解决你的问题,请参考以下文章

NSNotification 'object' 和 'userInfo' 有啥区别?

Delegate/Block/NSNotification与多线程

iOS 项目中的NSNotification简单使用

NSNotification/绑定?

ios8调用 - (void) onKeyboardShow:(NSNotification *)通知两次

iOS 通知(NSNotification)