- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为iPhone构建一个标签栏应用程序,并且正在将Core Data
与两个UIManagedDocument
一起使用。在第一个选项卡中,我将数据写入数据库,在第二个选项卡中,使用UITableView
将它们读入UIFetchedResultsController
。
在应用程序启动时,如果我先写入数据,然后再读取结果,则可以正常工作。结果立即显示在第二个选项卡中。但是,如果我先读取一些数据,然后再向数据库中写入一些数据,则结果将显示在第二个选项卡中,并且会有相当大的延迟(将近1分钟)。如果两个UIManagedObjectContext
或两个UIManagedDocument
之间存在任何同步问题,在第一种情况下它将如何工作?并且,对此延迟有什么解决方案吗?
最佳答案
您可以确保UIManagedDocument是最新的方法是确保正确保存更改。根据上面显示的信息,我不太确定如何管理文档或managedObjectContexts。有太多因素可能会影响这一点,从而无法为您提供100%的具体答案。
因此,不知道您的代码是什么样子,也不知道您如何管理上下文,我唯一能做的就是为您提供我在自己的项目中使用的内容。这可能对您有所帮助,也可能无济于事,但是在UIManagedDocument
处理核心数据方面,它对我的帮助超过了一次。
关于上下文:
我使用单例来管理UIManagedDocument。之所以这样做,是因为我不想处理您在上面所说的内容-具有多个managedObjectContext。当您开始处理多个上下文时,您会遇到以下问题:除非正确管理所有上下文,否则数据将不一致。如果您保存其中一个但不更新另一个,则您的数据可能会变得不同步。您还必须确保每个上下文都在属性thread
上起作用-Apple文档是了解为什么广告如此重要的重要资源。
不过,要点是,这是使用UIManagedDocument的最大问题之一,并没有像使用纯核心数据和使用SQL持久存储那样糟糕。我发现的主要原因是因为UIManagedDocument实际上是如何保存到其UIDocument存储的。关于何时保存它是非常不可预测的。这使您知道UIManagedDocument何时会真正持久保存,并使您的数据处于黑暗中。您最终不得不做各种愚蠢的事情,只是要确保它总是随时可用。
考虑到我有一个信念(很多人也许是对的,相信这是一个无知的信念),认为处理核心数据很困难,并且UIManagedDocument使得它比根本不使用它更容易。话虽这么说,但是当我使用像UIManagedDocument这样简单的东西变得复杂时,我不喜欢它-所以我使用了一件事始终保持简单,那就是单个UIManagedDocument的单例共享实例,因此我只有1个ManagedObjectContext可以使用。
关于保存:
每当我对模型进行任何重大更改(Create,Update,Delete,Edit)时,我总是确保调用[document updateChangeCount:UIDocumentChangeDone];
这样做,因为在使用UIManagedDocument时我不使用“撤消管理器”(NSUndoManager)。仅仅是因为我还不需要,再加上因为我讨厌您要处理的所有“变通”垃圾。
仅在主线程上工作:
每当我对UIManagedDocument或Core Data执行任何操作时,我始终确保其在主线程上。我想我已经讲过一次,但是我会再说一遍:在线程中工作在您需要时很有帮助,而且在您实际了解线程时也很有用。我喜欢在线程中工作,但这要付出复杂性的代价,这使我在涉及核心数据时不想在其中工作。在这种情况下,我倾向于严格地保留在主线程上,因为这使事情变得简单和容易(对我而言)。
保存文件
当我绝对需要确保UIManagedDocument已“保存”(写入磁盘)时,我有两种编写和使用的方法,对我来说总是可以使用它们:saveDocument
和forceSaveDocument
。
第一个(saveDocument)仅检查上下文的更改。如果有,则检查是否有任何新插入的对象。找到insertedObjects时,它将获取这些项目的权限ID。您可以认为这是确保核心数据模型是最新的,并且托管上下文处于安全状态的一种好方法,这样,当实际保存文档时,便可以将所有内容保存在该状态下。它必须存在(您的ID已实现,您的上下文很整洁,一旦完成所有工作,您要保存的内容就代表了模型的状态)。
它的大哥forceSaveDocument
实际上首先呼叫saveDocument
。再次,以确保您的实际模型/上下文已保存且正确。如果返回成功(是),则它将实际进行保存并通过saveToUrl
将文档写入磁盘。
一些代码(希望有帮助):
如果有帮助,以下是这两种方法:
-(BOOL)saveDocument {
NSManagedObjectContext *context = self.document.managedObjectContext;
if(!context.hasChanges) return YES;
NSSet *inserts = [context insertedObjects];
if([inserts count] > 0) {
NSError *error = nil;
if(![context obtainPermanentIDsForObjects:[inserts allObjects] error:&error] && error) {
[self reportError:error];
return NO;
}
}
return YES;
}
-(void)forceSaveDocument {
if( [self saveDocument] ) {
[self.document saveToURL:self.document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:self.onSaveBlock ? self.onSaveBlock : nil];
}
}
UIManagedDocument
,直到绝对需要多个线程为止-然后迁移以开始使用多个上下文(我从来不需要这样做-但是我再次尝试使事情变得简单)
updateChangeCount:UIDocumentChangeDone
。它的重量很轻,几乎没有影响。如果有的话,这将有助于确保您的文档保持最新状态,并且永远不会与数据太不同步。
关于ios - 多个UIManagedDocument用于读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24218337/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!