首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSMetaDataQuery未完成

NSMetaDataQuery未完成
EN

Stack Overflow用户
提问于 2017-03-31 11:33:36
回答 3查看 746关注 0票数 2

我正在尝试使用NSMetaDataQuery在iCloud中浏览我的应用程序可用的文件。我可以开始查询,但它永远不会结束。这是我的代码。

代码语言:javascript
复制
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")
}

这将打印以下内容:

代码语言:javascript
复制
didStart found 0 items
metaDataQuery.start() returned true

正在调用didStart,但从未调用过didFinishdidUpdate。如果我用====[cd]代替谓词中的like,我会得到同样的结果。将NSMetadataQueryUbiquitousDocumentsScope更改为NSMetadataQueryUbiquitousDataScope不起作用。我遗漏了什么?

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

EN

回答 3

Stack Overflow用户

发布于 2017-04-02 07:15:40

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

代码语言:javascript
复制
let metaDataQuery = NSMetadataQuery()

这实际上使metaDataQuery作为本地对象,它的生命周期在函数作用域中,并将在函数结束时销毁。那它怎么能工作呢?请将其设置为成员字段。

票数 2
EN

Stack Overflow用户

发布于 2017-08-11 06:49:33

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

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

代码语言:javascript
复制
DispatchQueue.main.async {
    self.query.start()
}
票数 2
EN

Stack Overflow用户

发布于 2017-04-01 18:16:54

变化

代码语言:javascript
复制
    NSPredicate(format: "%K like '*'", NSMetadataItemFSNameKey)

代码语言:javascript
复制
    NSPredicate(format: "%K like '*.*'", NSMetadataItemFSNameKey)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43131977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档