SDWebImageDownloader
1.将operation加入到URLOperations(并发+barrier加锁方式)
URLOperations
是一个key是NSURL
,value是NSOperation
的字典
为什么在URLOperations
写入新值时,不要@synchronized
而是并发队列+barrier
?两者区别是什么?
-
@synchronized
是同步锁,效率低 -
并发队列+barrier
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
)来下载图片
- 附注:
SDWebImageDownloader
与SDWebImageDownloaderOperation
解耦不是很好,他们共用了session
,导致session对的delegate重复,为什么两者不能合并一起
- Image I/O的使用,以及优化