使用pip3
和NSFileWrapper
。文件写入发生在:
UIDocument
在saveMyData()中修改了包装器。
似乎发生的事情是class MyDocument: UIDocument {
var wrapper: NSFileWrapper?
override internal func contentsForType(typeName: String) throws -> AnyObject {
// called by doc.saveToURL
if wrapper != nil {
// resaving an existing doc
}
else {
wrapper = NSFileWrapper.init(directoryWithFileWrappers: [:])
saveMyData()
}
return wrapper!
}
}
在一个单独的线程上运行,并且在极少数情况下将运行,因为在saveMyData中修改了包装器,导致“在枚举时收集已突变”错误。
我已经阅读了有关Objective-C的contentsForType
的其他主题,但Swift的等价物仍然让我感到困惑。什么是避免错误的最佳方法?另外,测试错误的最佳方法是什么?它可能发生在.001当时,在奇怪的情况下,当用户同时进行数据更改时保存运行。
我读过的一个可能的解决方案是使用@synchronized
命令。是否可以通过以下方式将defer
和objc_sync_enter
包含在saveMyData()中?
objc_sync_exit
不确定哪个线程最终等待另一个线程以及如何。
谢谢!