UIDocument автосохранение не работает

У меня есть собственный подкласс UIDocument, который я использую для хранения контента пользователя для моего приложения. Я звоню -[UIDocument updateChangeCount:UIDocumentChangeDone] непосредственно для отслеживания изменений в документе. Сохранение и загрузка работают нормально, но документ никогда не сохраняется автоматически. Почему это происходит?

1 ответ

Решение

Оказывается, проблема была в том, что я не звонил -[UIDocument updateChangeCount:] из основного потока. Несмотря на то, что UIDocument не является элементом пользовательского интерфейса, он все еще является частью UIKit и поэтому обычные предостережения о всегда взаимодействовать с UIKit классы из основного потока все еще применяются.

Упаковка кода в отправку в основную очередь исправила проблему:

dispatch_async(dispatch_get_main_queue(), ^{
    [doc updateChangeCount:UIDocumentChangeDone];
});

Во-первых, обновленная информация об ответе Джейсона для Swift:

DispatchQueue.main.async {
    doc.updateChangeCount(.done)
}

Это прекрасно работает, если вы просто звоните в одном или двух местах. Однако, если у вас есть несколько вызовов и существует вероятность того, что они находятся в фоновых потоках, это может быть выгодно для подкласса UIDocument и переопределить updateChangeCount(:) Функция так, чтобы вы осуществили основной вызов. В противном случае вы становитесь ответственным за каждый раз основной вызов, что может привести к потенциальной пропущенности, что приведет к попаданию документа в saveError государство.

Затем в вашем подклассе будет переопределение:

override func updateChangeCount(_ change: UIDocumentChangeKind) {
    DispatchQueue.main.async {
        super.updateChangeCount(change)
    }
}
Другие вопросы по тегам