我有一个按钮,可以将 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(主线程),您需要通过 NSManagedObjectContext
的 initWithConcurrencyType 将上下文放在它自己的私有(private)队列中:
方法。专用队列将为您处理与上下文有关的任何后台线程。这三种类型是:
NSConfinementConcurrencyType
NSPrivateQueueConcurrencyType
NSMainQueueConcurrencyType
你会想要 NSPrivateQueueConcurrencyType
。
您可以通过使用具有不同并发类型的子/嵌套托管对象上下文来采用更复杂的架构路线,但如果您是 Core Data 的新手,请坚持使用单一上下文,直到您牢牢掌握上下文和队列。
关于ios - 在后台线程上执行核心数据保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923671/