我正在尝试使用NSMetaDataQuery在iCloud中浏览我的应用程序可用的文件。我可以开始查询,但它永远不会结束。这是我的代码。
func report1() {
let filemgr = FileManager.default
let url = filemgr.url(forUbiquityContainerIdentifier: nil)
guard url != nil else {
print("url is nil")
return
}
let metaDataQuery = NSMetadataQuery()
metaDataQuery.predicate =
NSPredicate(format: "%K like '*'", NSMetadataItemFSNameKey)
metaDataQuery.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]
NotificationCenter.default.addObserver(self,
selector: #selector(didFinish),
name: NSNotification.Name.NSMetadataQueryDidFinishGathering,
object: nil)
NotificationCenter.default.addObserver(self,
selector: #selector(didStart),
name: NSNotification.Name.NSMetadataQueryDidStartGathering,
object: nil)
NotificationCenter.default.addObserver(self,
selector: #selector(didUpdate),
name: NSNotification.Name.NSMetadataQueryDidUpdate,
object: nil)
let result = metaDataQuery.start()
print("metaDataQuery.start() returned \(result)")
}
@objc func didStart(notification: NSNotification) {
let query: NSMetadataQuery = notification.object as! NSMetadataQuery
print("didStart found \(query.results.count) items")
}
@objc func didFinish(notification: NSNotification) {
print("didFinish")
}
@objc func didUpdate(notification: NSNotification) {
print("didUpdate")
}这将打印以下内容:
didStart found 0 items
metaDataQuery.start() returned true正在调用didStart,但从未调用过didFinish和didUpdate。如果我用==或==[cd]代替谓词中的like,我会得到同样的结果。将NSMetadataQueryUbiquitousDocumentsScope更改为NSMetadataQueryUbiquitousDataScope不起作用。我遗漏了什么?
同样的问题似乎已经在这个论坛上提出了好几次,但我没有找到任何令人满意的答案。
发布于 2017-04-02 07:15:40
我想我找到原因了。你的代码
let metaDataQuery = NSMetadataQuery()这实际上使metaDataQuery作为本地对象,它的生命周期在函数作用域中,并将在函数结束时销毁。那它怎么能工作呢?请将其设置为成员字段。
发布于 2017-08-11 06:49:33
对我来说,问题是我没有从主线程调用query.start() (我找到了solution here。
对我来说,解决方法很简单:
DispatchQueue.main.async {
self.query.start()
}发布于 2017-04-01 18:16:54
变化
NSPredicate(format: "%K like '*'", NSMetadataItemFSNameKey)至
NSPredicate(format: "%K like '*.*'", NSMetadataItemFSNameKey)https://stackoverflow.com/questions/43131977
复制相似问题