gpt4 book ai didi

iOS 11 文件提供程序 - 永远不会枚举工作集

转载 作者:行者123 更新时间:2023-11-29 11:32:26 24 4
gpt4 key购买 nike

我目前正在开发 iOS 11 File Provider 扩展,以枚举我们的服务远程存储的文件。到目前为止,我已经能够浏览我的缓存文件数据库,以及我的项目的云枚举。

我的下一步是创建工作集,但到目前为止,我还没有发现使用我的工作集枚举器进行系统枚举的任何成功。枚举器已创建,但从未枚举,无论是枚举项还是更改。

我为我的项目使用本地数据库,跟踪 lastUsedDatetagDatafavoriteRank。它们尚未跨设备同步,但这不应阻止本地设备显示这些项目。每次我的主机应用程序显示文件时,它都会设置其 lastUsedDate 并调用 signalEnumerator(for: myItemIdentifier)signalEnumerator(for: .workingSet).

我的 NSFileProviderExtension 子类实现了 setTagData(...)setFavoriteRank(...)setLastUsedDate(... ) 也是如此。

我有一个专门的类来枚举工作集,如下所示:

class WorkingSetEnumerator: NSObject, NSFileProviderEnumerator {
let items: [NSFileProviderItem]
// Initialise with the workings set items, might not be correct but should work as first step
init(items: [NSFileProviderItem]) {
self.items = items
super.init()
}

func invalidate() {
// Empty since it is a "dummy" implementation
}

func enumerateItems(for observer: NSFileProviderEnumerationObserver, startingPage page: NSFileProviderPage) {
observer.didEnumerate(self.items)
observer.finishEnumerating(upTo: nil)
}

func enumerateChanges(for observer: NSFileProviderChangesObserver, from anchor: NSFileProviderSyncAnchor) {
//TODO: Implement!
fatalError("Not Implemented, yet!")
}
}

这里没什么特别的。为了举例,它在这里用虚拟数据初始化,但我也尝试使用实时数据和同样的问题。

请求枚举器的函数实现如下: override func enumerator(for containerItemIdentifier: NSFileProviderItemIdentifier) 抛出 -> NSFileProviderEnumerator {

    if containerItemIdentifier == .rootDirectory {
// return a folder enumerator on the root
} else if containerItemIdentifier == .workingSet {
let items = [DummyItem()]
return WorkingSetEnumerator(items: items)
} else {
// return Folder or File enumerator based on the item
}
}

这是我的 DummyItem 的实现:

class DummyFileItem: NSObject, NSFileProviderItem {
var parentItemIdentifier: NSFileProviderItemIdentifier {
return NSFileProviderItemIdentifier.rootContainer
}

var itemIdentifier: NSFileProviderItemIdentifier {
return NSFileProviderItemIdentifier("Dummy")
}

var filename: String {
return "Dummy"
}

var typeIdentifier: String {
return "public.folder"
}

var isShared: Bool {
return true
}

var isTrashed: Bool {
return false
}

var lastUsedDate: Date? {
return Date()
}

var favoriteRank: NSNumber? {
return NSNumber(value: NSFileProviderFavoriteRankUnranked)
}

var tagData: Data? {
return nil
}

var documentSize: NSNumber? {
return NSNumber(value: 0)
}

var childItemCount: NSNumber? {
return NSNumber(value: 0)
}

var isDownloading: Bool {
return false
}

var isDownloaded: Bool {
return true
}

var downloadingError: Error? {
return nil
}

var isUploaded: Bool {
return true
}

var isUploading: Bool {
return false
}

var uploadingError: Error? {
return nil
}

var isMostRecentVersionDownloaded: Bool {
return true
}

var isSharedByCurrentUser: Bool {
return true
}
}

只是一些虚拟数据,至少应该在最近的选项卡中显示我的项目。

如前所述,我也尝试过使用包含真实数据的本地项目,同样的情况发生了,枚举器被创建但未被枚举。

有没有办法强制枚举工作集?根据我对可能缺少的内容的描述有什么想法吗?

感谢您的宝贵时间和帮助。

最佳答案

感谢 Apple 论坛上的这个答案,我设法让它工作:https://forums.developer.apple.com/thread/100172?q=iOS11%20File%20Provider%20working%20set .

缺少的是工作集的 NSFileProviderSyncAnchor。对于我的虚拟数据,同步 anchor 仅提供一个硬编码为 0 的 Int64,并且工作集现在被枚举一次,这对于我的虚拟示例来说已经足够了。

现在要使其适用于我的实际数据,我需要在每次对属于工作集的文件进行更改并向工作集发出更改信号时正确地跟踪它。'

希望这对某些人有所帮助,因为这不是微不足道的,也不是很好的记录。

关于iOS 11 文件提供程序 - 永远不会枚举工作集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52166719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com