/* * This file is part of the SDWebImage package. * (c) Olivier Poitrey * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ #import "SDAsyncBlockOperation.h" @interface SDAsyncBlockOperation () @property (assign, nonatomic, getter = isExecuting) BOOL executing; @property (assign, nonatomic, getter = isFinished) BOOL finished; @property (nonatomic, copy, nonnull) SDAsyncBlock executionBlock; @end @implementation SDAsyncBlockOperation @synthesize executing = _executing; @synthesize finished = _finished; - (nonnull instancetype)initWithBlock:(nonnull SDAsyncBlock)block { self = [super init]; if (self) { self.executionBlock = block; } return self; } + (nonnull instancetype)blockOperationWithBlock:(nonnull SDAsyncBlock)block { SDAsyncBlockOperation *operation = [[SDAsyncBlockOperation alloc] initWithBlock:block]; return operation; } - (void)start { if (self.isCancelled) { return; } [self willChangeValueForKey:@"isExecuting"]; self.executing = YES; [self didChangeValueForKey:@"isExecuting"]; if (self.executionBlock) { self.executionBlock(self); } else { [self complete]; } } - (void)cancel { [super cancel]; [self complete]; } - (void)complete { [self willChangeValueForKey:@"isExecuting"]; [self willChangeValueForKey:@"isFinished"]; self.executing = NO; self.finished = YES; [self didChangeValueForKey:@"isExecuting"]; [self didChangeValueForKey:@"isFinished"]; } @end