0

我正在研究 NSOperation 并且我对根据我的情况实施它的正确方法有疑问。

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

假设我有一堂课:

ClassX 
- (void) heavyOp1
- (void) heavyOp2
- (void) heavyOp3

每个 heavyOp 都与 相关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" options:NSKeyValueObservingOptionNew context:nil];,但我再次认为我正在打破概念。

NSOperation3)为我的每个heavyOp方法创建一个子类ClassX

那会产生很多子类并且很难管理它,我不知道它是否正确。

那么,解决问题的正确方法是什么?任何人都可以给我建议吗?也许我对我解释的选项之一有误。如果有不清楚的地方,请询问,我会尽力解释得更好。

4

1 回答 1

0

我倾向于考虑NSInvocationOperation用于改造现有代码的操作和队列。如果我从头开始,或者即使我想要更细粒度的控制(您提到的取消能力),我肯定会创建NSOperation.

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

于 2012-11-20T11:07:08.527 回答