我正在研究 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)为我的每个heavyOp方法创建一个子类ClassX
?
那会产生很多子类并且很难管理它,我不知道它是否正确。
那么,解决问题的正确方法是什么?任何人都可以给我建议吗?也许我对我解释的选项之一有误。如果有不清楚的地方,请询问,我会尽力解释得更好。