gpt4 book ai didi

cocoa - 我可以从 NSOperation 上的完成 block 保存到托管对象上下文吗?

转载 作者:行者123 更新时间:2023-12-03 17:15:33 25 4
gpt4 key购买 nike

我的应用程序使用 Core Data 和 NSOperationQueue。为了与 Apple 的指导方针保持一致,我为每个队列创建一个单独的托管对象上下文。就我而言,这非常简单:我有一个后台队列来完成所有繁重的工作,另一个在主线程上只读取数据。

对我来说,做这样的事情似乎是有意义的:

  • 在后台队列上,创建一个对托管对象上下文执行大量工作的操作。
  • 向该操作添加一个完成 block 以保存托管对象上下文。

但是我在 NSOperation 文档中读到:

The exact execution context for your completion block is not guaranteed but is typically a secondary thread. Therefore, you should not use this block to do any work that requires a very specific execution context. Instead, you should shunt that work to your application’s main thread or to the specific thread that is capable of doing it.

当然,这种保存必须从“拥有”托管对象上下文的同一线程中执行。但我并不总是清楚“线程”是否指操作队列。 (有时它以或多或少特定的方式使用。)

我的“完成 block ”策略可行吗?

最佳答案

在代码中的任何地方做一些小技巧来解决这个问题:创建 moc:

    moc = [[NSManagedObjectContext alloc] init];
[moc setUndoManager:nil];
[moc setPersistentStoreCoordinator:coordinator];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(importerDidSave:) name:NSManagedObjectContextDidSaveNotification object:self.moc];

不要忘记删除观察者:

- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:self.moc];
[moc release];
[super dealloc];
}

最后,在合并更改之前检查是否是主线程:

- (void)importerDidSave:(NSNotification *)saveNotification {
NSLog(@"MERGE in client controller");
if ([NSThread isMainThread]) {
[self.mainMoc mergeChangesFromContextDidSaveNotification:saveNotification];

} else {
[self performSelectorOnMainThread:@selector(importerDidSave:) withObject:saveNotification waitUntilDone:NO];
}
}

关于cocoa - 我可以从 NSOperation 上的完成 block 保存到托管对象上下文吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7665017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com