【问题标题】:NSMetaDataQuery does not completeNSMetaDataQuery 未完成
【发布时间】:2017-08-25 05:04:51
【问题描述】:

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

同样的问题好像已经在这个论坛上提出过好几次了,但是我没有找到任何满意的答案。

【问题讨论】:

    标签: swift3 icloud nsmetadataquery


    【解决方案1】:

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

    let metaDataQuery = NSMetadataQuery()
    

    这实际上使得metaDataQuery成为local对象,它的生命周期在函数作用域内,函数结束时会被销毁。那么它是如何工作的呢? 请将其设为会员字段。

    【讨论】:

    • 不,这也不起作用。我将声明移至对象范围并得到相同的结果。我认为这是因为局部变量实际上是指向 NSMetadataQuery 对象的指针。调用 metaDataQuery.start() 将导致指针的副本缓存在实现代码中,因此对象不会被垃圾回收。
    【解决方案2】:

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

    对我来说,解决方法很简单:

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

    【讨论】:

      【解决方案3】:

      改变

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

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

      【讨论】:

      • 这两种方法中的任何一种都可以使用(取决于您要查找的内容):-)
      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 2014-06-21
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 2017-10-19
      • 2013-08-16
      相关资源
      最近更新 更多