我需要你们对我的应用程序设计的建议,基本上我想知道它是否会按我的预期工作?由于多线程是非常棘手的事情,我想听听你的意见。
基本上我的任务很简单- 我已经SomeBigSingletonClass
- 大单例类,它有两个方法someMethodOne
,someMethodTwo
这些方法应该定期调用(基于计时器)并在单独的线程中调用。但是此时每个线程应该只有一个实例,例如someMethodOne
,任何时候都应该只有一个运行,对于someMethodTwo
.
我试过的
GCD - 使用 GCD 实现但它缺乏非常重要的功能,它不提供检查当前是否有任何正在运行的任务的方法,即我无法检查是否只有一个正在运行的 let saysomeMethodOne
方法实例。
NSThread - 它确实提供了很好的功能,但我很确定 NSOperation 和 GCD 等新的高级技术将使维护我的代码变得更加简单。所以我决定放弃 NSThread。
NSOperation
我计划如何实现两个线程调用的解决方案
@implementation SomeBigSingletonClass
- (id)init
{
...
// queue is an iVar
queue = [[NSOperationQueue alloc] init];
// As I'll have maximum two running threads
[queue setMaxConcurrentOperationCount:2];
...
}
+ (SomeBigSingletonClass *)sharedInstance
{
static SomeBigSingletonClass *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[SomeBigSingletonClass alloc] init];
});
return sharedInstance;
}
- (void)someMethodOne
{
SomeMethodOneOperation *one = [[SomeMethodOneOperation alloc] init];
[queue addOperation:one];
}
- (void)someMethodTwo
{
SomeMethodTwoOperation *two = [[SomeMethodOneOperation alloc] init];
[queue addOperation:two];
}
@end
最后我的 NSOperation 继承类看起来像这样
@implementation SomeMethodOneOperation
- (id)init
{
if (![super init]) return nil;
return self;
}
- (void)main {
// Check if the operation is not running
if (![self isExecuting]) {
[[SomeBigSingletonClass sharedInstance] doMethodOneStuff];
}
}
@end
SomeMethodTwoOperation
操作类也是如此。