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与多线程