文档关闭后调用的 Swift UIDocument 自动保存并且类不会取消初始化

Posted

技术标签:

【中文标题】文档关闭后调用的 Swift UIDocument 自动保存并且类不会取消初始化【英文标题】:Swift UIDocument autosave called after document closes and class doesn't deinit 【发布时间】:2016-02-22 05:12:58 【问题描述】:

App 具有从 CollectionViewController 创建的 UIDocument。 UIDocument 使用包装器和 autosaveWithCompletionHandler。

class myDocument: UIDocument 
    var wrapper: NSFileWrapper?
    var data: [Int] = []

    override internal func contentsForType(typeName: String) throws -> AnyObject 
        // called by doc.saveToURL
        return wrapper!
    

func SaveMyData() 
    wrapper!.addRegularFileWithContents(.......)
    self.updateChangeCount(.Done) // which eventually calls 
    // autosaveWithCompletionHandler which calls saveToURL 
    // which calls contentsForType


创建 UIDocument 实例(和 viewController)的 UICollectionViewController 只保留来自应用目录和常用方法的 url 列表。

class DocChooserCollectionViewController: UICollectionViewController, UIGestureRecognizerDelegate 
    let myExtension = "whatever"
    var documents: [NSURL] = []

问题是:通过 UIDocument 方法保存的异步文件可能会在视图控制器关闭(几秒钟后)并解除分配并且用户再次看到 UICollectionViewController 之后发生。捕捉这个并知道最终保存已经发生的正确方法是什么,从而将包装器属性设置为 nil 并允许释放 UIDocument?我猜 viewController 的 deinit() 可以在 UIDocument 的实例中设置一个 'done' 属性,但这听起来并不干净,并且仍然不知道何时将 wrapper 属性设置为 nil。

谢谢!

【问题讨论】:

【参考方案1】:

解决了文档保存异步和 UIDocument 内存释放问题。在视图控制器中:

deinit 
    print("myViewController is being deinitialized")
    doc.CloseNow()

在我的 UIDocument 子类中:

func CloseNow() 
    self.closeWithCompletionHandler((success) in
        if (success) 
            print("close succeeded")
         else 
            print("close failed")
        
    )

Instruments 显示内存正在释放,trace 显示 doc 正在保存并且 UIDocument 已被取消初始化。

【讨论】:

以上是关于文档关闭后调用的 Swift UIDocument 自动保存并且类不会取消初始化的主要内容,如果未能解决你的问题,请参考以下文章

UIDocument 打开/关闭行为

UIDocument 无法再次关闭?

在哪里存储 UIDocument 的预览?

打开 UIDocument 时如何显示错误消息?

尝试关闭 UIDocument 时防止崩溃

使用 setUbiquitous 为 UIDocument 文件关闭 iCloud 同步时出错(LibrarianErrorDomain 错误 2)