为什么 SDWebImage'downloader 使用并发队列来保存回调?
why the SDWebImage'downloader use concurrent queue to save callbacks?
为什么SD不用"serial queue"或"synchrolock",SD这样用,dispatch_barrier_async
_barrierQueue=dispatch_queue_create("com.hackemist.SDWebImageDownloaderBarrierQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_barrier_sync(self.barrierQueue, ^{
....
});
dispatch_barrier_async(sself.barrierQueue, ^{
[sself.URLCallbacks removeObjectForKey:url];
});
dispatch_sync(sself.barrierQueue, ^{
callbacksForURL = [sself.URLCallbacks[url] copy];
});
TL;DR;为了更好的表现。
- 一个写操作(包括删除)必须是一个原子操作,所以它们被包裹在一个屏障块中
- 读取操作可以并行,所以它们被包裹在一个同步块中,以提高多核性能
为什么SD不用"serial queue"或"synchrolock",SD这样用,dispatch_barrier_async
_barrierQueue=dispatch_queue_create("com.hackemist.SDWebImageDownloaderBarrierQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_barrier_sync(self.barrierQueue, ^{
....
});
dispatch_barrier_async(sself.barrierQueue, ^{
[sself.URLCallbacks removeObjectForKey:url];
});
dispatch_sync(sself.barrierQueue, ^{
callbacksForURL = [sself.URLCallbacks[url] copy];
});
TL;DR;为了更好的表现。
- 一个写操作(包括删除)必须是一个原子操作,所以它们被包裹在一个屏障块中
- 读取操作可以并行,所以它们被包裹在一个同步块中,以提高多核性能