我正在研究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}}的子类?
这会产生很多子类,很难管理它,我不知道它是否正确。
那么,解决问题的正确方法是什么?有人可以给我建议吗?也许我错误地解释了其中一个选项。如果事情不明确,请问我会尝试更好地解释。
答案 0 :(得分:0)
我倾向于认为NSInvocationOperation
用于改编操作和队列到现有代码。如果我是从头开始,或者即使我想要更细粒度的控制(如你所提到的那样取消的能力),我肯定会创建NSOperation
的子类。
如果不确切知道你的重型操作是什么,很难肯定地说,但我也倾向于将它们创建为三个独立的类。取消每个操作可能有不同的事情需要完成,所以很明显让代码在不同的类中执行取消。