我目前正在开发 iOS 11 File Provider 扩展来枚举我们的服务远程存储的文件。到目前为止,我已经能够浏览缓存的文件数据库,以及我的项目的云枚举。
我的下一步是创建工作集,但到目前为止,我还没有发现让系统使用我的工作集枚举器进行枚举的任何成功。枚举器被创建,但从不枚举,无论是枚举项目还是更改。
lastUsedDate
我为我的项目使用本地数据库,跟踪 .tagData
和favoriteRank
. 它们尚未跨设备同步,但这不应阻止本地设备显示这些项目。每次我的主机应用程序显示一个文件时,它都会设置它的lastUsedDate
and 调用signalEnumerator(for: myItemIdentifier)
and 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) throws -> 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
}
}
只是一些虚拟数据,至少应该在最近的标签中显示我的项目。
如前所述,我还尝试使用包含真实数据的本地项目,同样的情况是,创建了枚举器但未枚举。
有没有办法强制枚举工作集?根据我对可能缺少的内容的描述有什么想法吗?
感谢您的时间和帮助。