SDWebImage肢解分析

SDWebImageDownloader

1.将operation加入到URLOperations(并发+barrier加锁方式)

URLOperations是一个key是NSURL,value是NSOperation的字典
为什么在URLOperations写入新值时,不要@synchronized而是并发队列+barrier?两者区别是什么?

  • @synchronized是同步锁,效率低
  • 并发队列+barrier
    image.png
dispatch_queue_t queue = dispatch_queue_create("APP_TEST", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
    NSLog(@"---1");
});
dispatch_async(queue, ^{
    NSLog(@"---2");
});
dispatch_async(queue, ^{
    NSLog(@"---3");
});

dispatch_barrier_sync(queue, ^{
    for (int i = 0; i < 50000; i ++) {
        if (i == 5000) {
            NSLog(@"p1");
        }else if (i == 6000){
            NSLog(@"p2");
        }else if (i == 7000){
            NSLog(@"p2");
        }
    }
    NSLog(@"barrier");
});

dispatch_async(queue, ^{
    NSLog(@"---4");
});
dispatch_async(queue, ^{
    NSLog(@"---5");
});
dispatch_async(queue, ^{
    NSLog(@"---6");
});
  • 附注:
    iOS版本小于6.0需要手动释放dispatch_release(_barrierQueue);,正常ARC下不需要
    iOS版本小于6.0可以通过OS_OBJECT_USE_OBJC来判断,为0,则iOS<6.0

SDWebImageDownloaderOperation

1. 自定义一个线程(NSOperation)来下载图片
  • 附注:
    SDWebImageDownloaderSDWebImageDownloaderOperation解耦不是很好,他们共用了session,导致session对的delegate重复,为什么两者不能合并一起
  1. Image I/O的使用,以及优化

你可能感兴趣的:(SDWebImage肢解分析)