在单个NSOperationQueue iOS中管理多个操作,如暂停/恢复单个操作

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];- 这将阻止队列添加新操作,但我想控制队列中的现有操作.

等待你的答案.

提前致谢 !

Pau*_*w11 6

没有内置的暂停特定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]

  • 在检查你的答案之后,我认为这应该是一个技巧,我肯定会尝试上面的代码,希望它能解决我的问题,非常感谢@ Paulw11的快速和详细的答案.真的很感激! (2认同)