ios - 在后台线程上执行核心数据保存?

标签 ios objective-c core-data structure nsmanagedobjectcontext

我有一个按钮,可以将 Core Data SQLite 中的选定条目标记为“收藏夹”,这意味着我只是将该索引的 BOOL 从关闭切换为打开。

目前,当我执行此操作时,我会在 managedObjectContext 上调用 save,根据 Instruments 的说法,这可能需要 500 毫秒,甚至可能更长一些。

我有一些同时执行的代码触发了一个漂亮的小粒子爆炸(“万岁,最喜欢的!”),但我遇到了一个问题,爆炸被延迟到 保存之后 已经完成。

我不确定为什么,因为触发爆炸的代码在 save 调用之前。我是一个相对较新的程序员,所以也许我遗漏了一些东西,但在这种情况下代码不会逐行执行,因为爆炸会触发,然后保存会在它进行时发生吗?此处的委托(delegate)调用可能也需要一些时间,但同样的问题也适用,如果它在这些代码行之后有什么关系呢?

编辑:我说的是在粒子出现在下一行代码之前主线程被阻塞,这意味着 UI 无法自行更新吗?

这是我的代码:

// Particle animation
LikeExplosion *likeExplosionView = [[LikeExplosion alloc] initWithFrame: CGRectMake(0, 0, 320, 400)];
[likeExplosionView setUserInteractionEnabled: NO];
[self.view addSubview: likeExplosionView];
[self.view bringSubviewToFront: likeExplosionView];
[likeExplosionView decayOverTime: 1.1];

// Delegate call to reload tableview elsewhere
[self.delegate detailViewControllerDidLikeLine];

// Update current object
[_selectedLine setIsLiked: [NSNumber numberWithBool: YES]];
[_selectedLine setIsDisliked: [NSNumber numberWithBool: NO]];

// Update context
NSError *error;
if (![[[CDManager sharedManager] managedObjectContext] save:&error]) NSLog(@"Saving changes failed: %@, %@", error, [error userInfo]);

第一个问题:为什么在方法中先调用动画代码会出现延迟?

第二个问题:save 调用放在后台线程上是否可以解决问题,这样做是否安全/一个好主意?

最佳答案

动画以及通常与 UI 相关的任何内容都在主线程 上执行。如果您不希望持久化到磁盘(保存过程)来阻止您的 UI(主线程),您需要通过 NSManagedObjectContextinitWithConcurrencyType 将上下文放在它自己的私有(private)队列中: 方法。专用队列将为您处理与上下文有关的任何后台线程。这三种类型是:

NSConfinementConcurrencyType
NSPrivateQueueConcurrencyType
NSMainQueueConcurrencyType      

你会想要 NSPrivateQueueConcurrencyType

您可以通过使用具有不同并发类型的子/嵌套托管对象上下文来采用更复杂的架构路线,但如果您是 Core Data 的新手,请坚持使用单一上下文,直到您牢牢掌握上下文和队列。

关于ios - 在后台线程上执行核心数据保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923671/

相关文章:

iphone - 如何从一个 View 复制一个字符串并在下一个 View 中显示它?(iphone)

ios - 我需要推送通知来提醒用户某事吗

ios - 以编程方式向上或向下滚动选择器 View

iphone - OpenGL 不显示 iPhone 上辅助线程的结果

ios - FBSDKSharing 回调不返回结果

iphone - CoreBluetooth 在其他设备要求配对时触发一种方法?

ios - Swift - 一个月后重置数据

iphone - 将 UIButton 的文本设置为日期

ios - 使用 CoreData 和捆绑的 SQLite 数据库?

ios - NSFetchedResultsController 在后台线程上使用核心数据