NSMetaDataQuery无法完成

时间:2017-03-31 03:33:36

标签: swift3 icloud nsmetadataquery

我正在尝试使用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即被调用,但永远不会调用didFinishdidUpdate。如果我在谓词中将====[cd]替换为like,我会得到相同的结果。将NSMetadataQueryUbiquitousDocumentsScope更改为NSMetadataQueryUbiquitousDataScope无效。我错过了什么?

在这个论坛上似乎已多次提出同样的问题,但我找不到任何令人满意的答案。

3 个答案:

答案 0 :(得分:2)

对我来说,问题是我没有从主线程调用query.start()(我找到了solution here

对我而言,解决方案很简单:

DispatchQueue.main.async {
    self.query.start()
}

答案 1 :(得分:1)

我想我找到了原因。 你的代码

let metaDataQuery = NSMetadataQuery()

这实际上使metaDataQuery成为 local 对象,它的生命周期在函数范围内,并在函数结束时被销毁。那又怎么样呢? 请将其作为会员字段。

答案 2 :(得分:0)

更改

    NSPredicate(format: "%K like '*'", NSMetadataItemFSNameKey)

    NSPredicate(format: "%K like '*.*'", NSMetadataItemFSNameKey)