【问题标题】:Saving the same UIManagedDocument on two different devices generates error在两个不同的设备上保存相同的 UIManagedDocument 会产生错误
【发布时间】:2013-05-08 23:32:14
【问题描述】:

是否应该在我的两台设备上打开相同的UIManagedDocument,然后我保存(使用以下代码):

[self.documentDatabase.managedObjectContext performBlockAndWait:^{
    STNoteLabelCell *cell = (STNoteLabelCell *)[self.noteTableView cellForRowAtIndexPath:indexPath];

    [cell setNote:newNote animated:YES];
}];

我被告知 UIManagedDocuments documentState 更改为 UIDocumentStateSavingError 然后我收到此错误:

CoreData: error: (1) I/O error for database at /var/mobile/Applications/some-long-id/Documents/Read.dox/StoreContent.nosync/persistentStore.  SQLite error code:1, 'cannot rollback - no transaction is active'
2013-05-14 16:30:09.062 myApp[11711:4d23] -[_PFUbiquityRecordImportOperation main](312): CoreData: Ubiquity:  Threw trying to get the knowledge vector from the store: <NSSQLCore: 0x1e9e2680> (URL: file://localhost/var/mobile/Applications/some-long-id/Documents/Read.dox/StoreContent.nosync/persistentStore)

有人知道为什么会发生这个错误吗?

【问题讨论】:

    标签: icloud uimanageddocument


    【解决方案1】:

    有几件事...

    我认为在两台不同的设备上保存同一个文档是一个红鲱鱼,因为它实际上会在每台设备上处理您的数据库的本地副本 - 只有事务日志被上传到 iCloud。

    其次,我可能会感到困惑,但我在上面的代码 sn-p 中没有看到任何表明您正在执行保存的内容(除非它是由其中一个调用触发的,或者发生了自动保存)。

    代码 sn-p 似乎在做的是:

    • 在数据库文档的子 MOC 线程上,运行以下块 代码
    • 那段代码正在做纯粹的 UI 相关的事情, 实际上与数据库无关?唯一可能的 去数据库是 cellForRowAtIndexPath - 这通常 预计只会做读取操作,而不是做某事 需要保存。

    唯一的另一件事......如果上面的代码确实触发了保存 - 您可能会遇到将其作为 performBlockAndWait 执行的问题。 UIManagedDocument 保存例程异步执行操作 - 但它们需要运行循环才能执行,然后才能真正有机会运行异步部分......因此,在继续之前阻塞,您实际上可能会阻止执行实际保存或其他事情。

    我在这里猜测得很疯狂,但是已经看到了足够多的保存托管文档,知道要真正小心实际从哪个线程调用事物,并且在发出保存请求后,允许运行循环有机会真正做到。公平地说,这只是在一个方法内或循环中重复调用 saveToURL: 的问题,在这种情况下,保存的所有异步部分都会排队并在最后执行,通常会产生非常滑稽的效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多