SDWebImage 知识点

2017-06-06  本文已影响181人  iOS104
[self sd_cancelCurrentImageLoad];
@autoreleasepool {  
}
__weak __typeof(self)weakSelf = self;
__strong __typeof(weakSelf) strongSelf = weakSelf;

知识点整理:

1.这里的Dispatch_barrier_async来确保线程安全操作,任务需要等待之前的任务执行完
2.强大的Block回调和Associated Objects — runtime
3.NSOperationQueue和NSOperation的,相对于GCD来说,他能取消操作,也能设置任务之间的依赖,相较于GCD来说更加的强大,AF也是基于这个玩的,这样才可以完成LIFO的队列需求
4.NSCache和NSFileManager的二级缓存操作
5.缓存策略:超过一星期的杀掉,还能设置最大缓存数,根据文件的最后编辑时间进行升序,然后一个个删除,低于临界的时候清理完成
6.异步操作图片的处理,缩放和解压操作,还有图片的类型处理,这东西有空再研究,很少接触
7.还有就是同一URL不会被下载的优化处理
8.最后还是觉得封装和任务的分配都非常的清晰,值得学习

知识点:

- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;
__weak __typeof(self) weakSeld_AT = self;
//  代码段里面的self不被释放。
__weak typedef(weakSelf) strongSelf = weakSelf; 

图片解压

UIKIT_EXTERN NSData * __nullable UIImagePNGRepresentation(UIImage * __nonnull image);

// return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)                           
UIKIT_EXTERN NSData * __nullable UIImageJPEGRepresentation(UIImage * __nonnull image, CGFloat compressionQuality);
自定义并发的NSOperation

需要以下步骤:

当我们自定义一个 operation 类时,我们需要考虑在以下几个关键点检查 isCancelled 方法的返回值:


///  支持取消操作
- (void)main {
    @try {
        if (self.isCancelled) return;

        NSLog(@"Start executing %@ with data: %@, mainThread: %@, currentThread: %@", NSStringFromSelector(_cmd), self.data, [NSThread mainThread], [NSThread currentThread]);

        for (NSUInteger i = 0; i < 3; i++) {
            if (self.isCancelled) return;

            sleep(1);

            NSLog(@"Loop %@", @(i + 1));
        }

        NSLog(@"Finish executing %@", NSStringFromSelector(_cmd));
    }
    @catch(NSException *exception) {
        NSLog(@"Exception: %@", exception);
    }
}

在默认情况下,operation 是同步执行的,也就是说在调用它的 start 方法的线程中执行它们的任务。而在 operation 和 operation queue 结合使用时,operation queue 可以为非并发的 operation 提供线程,因此,大部分的 operation 仍然可以异步执行。

但是,如果你想要手动地执行一个 operation ,又想这个 operation 能够异步执行的话,你需要做一些额外的配置来让你的 operation 支持并发执行。下面列举了一些你可能需要重写的方法:

@implementation OQConcurrentOperation

@synthesize executing = _executing;
@synthesize finished  = _finished;

- (id)init {
    self = [super init];
    if (self) {
        _executing = NO;
        _finished  = NO;
    }
    return self;
}

- (BOOL)isConcurrent {
    return YES;
}

- (void)setFinished:(BOOL)finished {
    [self willChangeValueForKey:@"isFinished"];
    _finished = finished;
    [self didChangeValueForKey:@"isFinished"];
}

- (void)setExecuting:(BOOL)executing {
    [self willChangeValueForKey:@"isExecuting"];
    _executing = executing;
    [self didChangeValueForKey:@"isExecuting"];
}


@end

这一部分的代码看上去比较简单,但是却需要我们用心地去理解它。首先,我们用 @synthesize 关键字手动合成了两个实例变量 _executing 和 _finished ,然后分别在重写的 isExecuting 和 isFinished 方法中返回了这两个实例变量。另外,我们通过查看 NSOperation 类的头文件可以发现,executing 和 finished 属性都被声明成了只读的 readonly 。所以我们在 NSOperation 子类中就没有办法直接通过 setter 方法来自动触发 KVO 通知,这也是为什么我们需要在接下来的代码中手动触发 KVO 通知的原因。

上一篇 下一篇

猜你喜欢

热点阅读