我目前正在使用iOS 11 File Provider扩展程序来枚举由我们的服务远程存储的文件。 到目前为止,我已经能够浏览文件的缓存数据库以及项目的云枚举。
我的下一步是创建工作集,但是到目前为止,使用我的工作集枚举器枚举系统并没有取得任何成功。枚举器是创建的,但从不枚举,无论是枚举项目还是更改。
我使用本地数据库处理我的商品,并跟踪lastUsedDate
,tagData
和favoriteRank
。它们尚未跨设备同步,但这不应阻止本地设备显示这些项目。
每次我的主机应用程序显示文件时,它都会设置文件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!")
}
}
这里什么都没有。出于示例目的,此处使用伪数据对其进行了初始化,但我也尝试使用实时数据和相同的问题。
请求枚举数的函数实现如下: 重写func枚举器(用于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
}
}
一些虚拟数据至少应该在最近的标签中显示我的项目。
如前所述,我还尝试使用包含真实数据的本地项,并且同样的事情,创建了枚举器,但没有枚举。
是否有任何方法可以强制对工作集进行枚举?基于我对可能缺少的内容的描述有什么想法吗?
感谢您的时间和帮助。
答案 0 :(得分:1)
由于在苹果论坛https://forums.developer.apple.com/thread/100172?q=iOS11%20File%20Provider%20working%20set上的回答,我设法使它起作用。
缺少的是工作集的NSFileProviderSyncAnchor
。对于我的虚拟数据,同步锚仅提供一个Int64
硬编码为0,并且现在对工作集进行一次枚举,这对于我的虚拟示例就足够了。
现在要使其在我的实际数据上起作用,每当我对属于该工作集的文件进行更改并向该工作集发出更改信号时,我都需要正确地对其进行跟踪。'
希望这将对某人有所帮助,因为这不是小事,也没有很好的记录。