首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iCloud NSMetadataQuery和更新(NSMetadataQueryUpdateChangedItemsKey)

iCloud NSMetadataQuery和更新(NSMetadataQueryUpdateChangedItemsKey)
EN

Stack Overflow用户
提问于 2015-08-24 08:57:15
回答 2查看 426关注 0票数 3

我建议使用一个iCloud沙箱(iOS)来监视我的NSMetaDataQuery --而且一切都很好。

我试图在NSMetadataQueryUpdateChangedItemsKey中使用NSMetadataQueryDidUpdateNotification,以便有效地更新文件系统的内部模型。我面临的挑战是,当文件被移动/重命名时,我如何知道原始的文件路径-这样我就可以更新我的模型了?

看来NSMetaDataItem对象是持久化的(即当路径改变时同一个对象实例被更新),所以我可以使用指针值作为我的模型的一种索引。然而-我会利用一个明显的实现细节(这可能会改变)。也许,当内存不足时,NSMetaDataItems会被回收?

任何人都知道应该如何做到这一点(或者如果NSMetaDataItem对象在NSMetaDataQuery的生命周期中持续存在,并且保持对同一文件系统项的“附加”)。

EN

回答 2

Stack Overflow用户

发布于 2016-09-01 09:14:42

是的,NSMetadataQuery没有提供一种参考前面路径的方法。

当一个项被移动时,它在NSMetadataQuery结果中的索引保持不变。因此,我们可以复制结果的路径,当更新启动时,我们只需要在重复数组的确切位置上检查NSMetadataItem。

代码语言:javascript
运行
复制
    if let updatedObj = obj.userInfo?[NSMetadataQueryUpdateChangedItemsKey] as! [NSMetadataItem]? {

        for it in updatedObj {

            let url = it.valueForAttribute(NSMetadataItemURLKey) as! NSURL
            let value = it.valueForAttribute(NSMetadataUbiquitousItemIsUploadedKey) as! NSNumber

            print("Path: " + url.path!)
            print("Updated: " + value.stringValue)

            let index = metaDataQuery.indexOfResult(it)
            let prevPath = duplicatedPathArray[index]

            if (prevPath != url.path!) {
                print("File Moved. Previous path: " + prevPath)
                duplicatePath()
            }
        }
    }

确保每次添加或删除文件时都更新数组。

票数 2
EN

Stack Overflow用户

发布于 2016-11-27 21:22:35

文档提到,结果适合Cocoa绑定,这意味着这些对象很可能是持久化的。

我使用更多NSFilePresenterNSMetadataQuery并行运行的硬核组合来监视容器中的文档。NSFilePresenter有方便的API来检测文件何时被移动:

func presentedSubitem(at oldURL: URL, didMoveTo newURL: URL)

但是,要使其工作,当您在容器中移动文件时,必须显式地通知文件协调器您正在移动文件(参见第1-3点):

代码语言:javascript
运行
复制
let fc = NSFileCoordinator()
var error: NSError?

fc.coordinate(writingItemAt: from, options: .forMoving, writingItemAt: to, options: .forReplacing, error: &error, byAccessor: {
    (fromURL, toURL) in
    do {
        // 1
        fc.item(at: fromURL, willMoveTo: toURL)

        try FileManager.default.moveItem(at: fromURL, to: toURL)

        // 2
        fc.item(at: fromURL, didMoveTo: toURL)
    } catch {
        // 3
        fc.item(at: fromURL, didMoveTo: fromURL)
    }
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32178197

复制
相关文章

相似问题

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