正确用法:NSOperation和NSInvocationOperation

时间:2012-11-20 11:00:21

标签: objective-c ios nsoperation nsoperationqueue nsinvocationoperation

我正在研究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];

强制班级认识到像NSOperation这样的代码有效,但我认为我打破了概念。

3)从我的ClassX为每个heavyOp方法创建{{1}}的子类?

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

那么,解决问题的正确方法是什么?有人可以给我建议吗?也许我错误地解释了其中一个选项。如果事情不明确,请问我会尝试更好地解释。

1 个答案:

答案 0 :(得分:0)

我倾向于认为NSInvocationOperation用于改编操作和队列到现有代码。如果我是从头开始,或者即使我想要更细粒度的控制(如你所提到的那样取消的能力),我肯定会创建NSOperation的子类。

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