Objective c 正确用法:NSOperation和NSInvocationOperation

Objective c 正确用法:NSOperation和NSInvocationOperation,objective-c,ios,nsoperation,nsoperationqueue,nsinvocationoperation,Objective C,Ios,Nsoperation,Nsoperationqueue,Nsinvocationoperation,我正在研究NSO的运作,我怀疑根据我的情况如何正确实施 在我的应用程序中,我想在后台执行很多操作。因为我的应用程序可以从桌面软件导入数据,所以我的数据库可能会根据情况变得非常大。这样,读取和分析数据可能需要几秒钟的时间,我不希望在这段时间内冻结我的UI 让我们假设我有一门课: ClassX - (void) heavyOp1 - (void) heavyOp2 - (void) heavyOp3 每个重磅都与ClassX相关,因此它们属于同一个类是有意义的 我的问题和选择: 1) Class

我正在研究NSO的运作,我怀疑根据我的情况如何正确实施

在我的应用程序中,我想在后台执行很多操作。因为我的应用程序可以从桌面软件导入数据,所以我的数据库可能会根据情况变得非常大。这样,读取和分析数据可能需要几秒钟的时间,我不希望在这段时间内冻结我的UI

让我们假设我有一门课:

ClassX 
- (void) heavyOp1
- (void) heavyOp2
- (void) heavyOp3
每个重磅都与
ClassX
相关,因此它们属于同一个类是有意义的

我的问题和选择:

1)
ClassX
是否应该是
NSOperation
的子类

我知道操作应该代表一个任务,但我的类提供了3个不同的任务。我可以尝试使用一些自定义构造函数来控制执行,但我认为我可能打破了一个概念

2) 使用
NSInvocationOperation
是否正确?我不能取消它

我知道我可以做这样的事情:

ClassX *myClassX = [[ClassX alloc] init];
NSInvocationOperation *myOp = [[NSInvocationOperation alloc] initWithTarget:myClassX selector:@selector(heavyOp1) object:nil];
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
[myQueue myOp];
但是如果我调用
[myQueue cancelAllOperations]
ClassX不会响应
self.isCancelled
,因为它不存在于
NSInvocationOperation

使用以下代码强制类识别
[myOp addObserver:myClassX forKeyPath:@“isCancelled”选项:NSKeyValueObservingOptionNew context:nil]是有效的,但我再次认为我打破了概念

3) 从my
ClassX
为每个heavyOp方法创建一个子类
NSOperation

这将生成很多子类,并且可能很难管理它,我不知道它是否正确


那么,解决问题的正确方法是什么呢?有人能给我建议吗?也许我对其中一个选项的解释是错误的。如果有什么不清楚的地方,就问我,我会尽量解释得更好

我倾向于认为
NSInvocationOperation
被用来将操作和队列恢复到现有代码中。如果我从零开始,或者即使我想要更细粒度的控制(如您所提到的取消功能),我肯定会创建
NSOperation
的子类


如果不确切知道您的繁重操作是什么,很难说清楚,但我也倾向于将它们创建为三个独立的类。取消每个操作可能需要执行不同的操作,因此很明显,在不同的类中使用代码来执行取消操作。

一个非常常见的繁重操作的示例将很常见:从sqlite读取数据,处理它并返回一个NSArray和我的结果对象。我从零开始,我认为将所有“读取”操作都作为NSOperation是安全的,因为我的所有表都可以有很多记录。。。因此,您认为最好为每个“读取”情况创建NSOperation的子类,即使这会生成许多类?如果您有许多类似的读取操作,那么一个参数化的类可能是有意义的。如果你发现自己在重复大量的代码,你可能应该重构你的类。好的,我将尝试按照这种方式,看看是否有效。谢谢你的时间和建议。