Gau*_*gla 0 multithreading nsoperationqueue ios
在我的代码中,我想在队列中单独处理操作,并能够暂停和恢复队列中的操作操作.我该如何实现呢?
让我简单解释一下我的问题,我使用下面的代码来创建子类NSOperation的操作,并将此操作添加到NSOperationQueue.
@interface MyLengthyOperation: NSOperation
@end
@implementation MyLengthyOperation
- (void)main
{
// a lengthy operation
@autoreleasepool
{
for (int i = 0 ; i < 10000 ; i++)
{
// is this operation cancelled?
if (self.isCancelled)
break;
NSLog(@"%f", sqrt(i));
}
}
}
@end
Run Code Online (Sandbox Code Playgroud)
我创建了上面的操作,我正在调用它
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
myQueue.name = @"Download Queue";
myQueue.maxConcurrentOperationCount = 4;
[myQueue addOperation:operation];
Run Code Online (Sandbox Code Playgroud)
现在我想暂停并恢复我的操作.让我们假设循环在6786上,我按下暂停按钮,然后队列应暂停此操作,当我按下启动时,它应该从6786开始.
我想控制队列中的多个操作.我怎样才能做到这一点 ?
我看了[queue setSuspended:YES];- 这将阻止队列添加新操作,但我想控制队列中的现有操作.
等待你的答案.
提前致谢 !
没有内置的暂停特定NSOperation的能力,如果你想要这种行为,那么你需要自己构建它.
你可以用一个NSCondition来做 -
@interface MyLengthyOperation: NSOperation
@property (atomic) BOOL paused;
@property (nonatomic,strong) NSCondition *pauseCondition;
@end
@implementation MyLengthyOperation
-(instancetype) init {
if (self=[super init]) {
self.pauseCondition=[NSCondition new];
}
return self;
}
- (void)main
{
// a lengthy operation
@autoreleasepool
{
for (int i = 0 ; i < 10000 ; i++)
{
// is this operation cancelled?
if (self.isCancelled)
break;
[self.pauseCondition lock];
while (self.paused) {
[self.pauseCondition wait];
}
NSLog(@"%f", sqrt(i));
[self.pauseCondition unlock];
}
}
}
-(void)pause {
[self.pauseCondition lock];
self.paused=YES;
[self.pauseCondition signal];
[self.pauseCondition unlock];
}
-(void)resume {
[self.pauseCondition lock];
self.paused=NO;
[self.pauseCondition signal];
[self.pauseCondition unlock];
}
777441end
Run Code Online (Sandbox Code Playgroud)
然后你可以说[myOperation pause]和[myOperation resume]