我想知道一次可以提交多少个 setImageWithUrl 消息是否有上限?我正在尝试加载 30 张照片,其中 10 张下载成功,但其他在尝试调试问题时输入 requestFailed
任何提示或澄清?谢谢
我想知道一次可以提交多少个 setImageWithUrl 消息是否有上限?我正在尝试加载 30 张照片,其中 10 张下载成功,但其他在尝试调试问题时输入 requestFailed
任何提示或澄清?谢谢
对于那些来这里寻求有关 SDWebImage 中最大并发下载数的答案的人,我想补充一下之前的答案。
我不建议更改 SDWebImageDownloader 的 init,因为您可能想要更新 SDWebImage,或者像我一样调整应用程序不同区域的并发下载数量。
//thumbnails.m
//Loading thumbnails. It is faster to load them concurrently
SDWebImageManager.sharedManager.imageDownloader.maxConcurrentDownloads = 10;
[yourImageView setImageWithURL:thumbURL];
//fullScreen.m
//Loading big images in full-screen view,
SDWebImageManager *sharedManager = [SDWebImageManager sharedManager];
[sharedManager.imageDownloader setMaxConcurrentDownloads:1];
[sharedManager cancelAll]; //cancel all current queue
[yourImageView setImageWithURL:URL];
尽管您的问题是由于您提到的不正确的网址引起的,但我正在为其他前来寻找答案的人回答这个问题:
在最新版本的 SDWebImage 框架中,可以通过在 SDWebImageDownloader 的 init 中设置变量 downloadQueue.maxConcurrentOperationCount 来设置最大并发下载数。这将限制应用程序中“downloadwithURL”调用的最大并发下载数。该框架会将任何其他操作放入队列中,并在当前执行的下载完成时执行它们。
我通过设置这个值发现了一个奇怪的问题。根据苹果文档,这个值应该只影响并发下载图像数量,而不是总下载图像数量。但是,如果我的情况,如果这个值设置为 2,我只能下载 2 个图像,即使我调用下载函数超过 2。这个值似乎设置了 downloadQueue 大小的大小,而不是 currentOperation 数。有人有同样的问题吗??
maxConcurrentOperationCount
ofNSOperationQueue
在 iPhone 平台上只能设置为 1 到 6。maxConcurrentOperationCount
设置为NSOperationQueue
默认值不是一个好主意。因为这意味着无限数量的队列。
maxConcurrentOperationCount
ofNSOperationQueue
设置为 1 到 6 ?当可以同时调用多个任务时,maxConcurrentOperationCount
ofNSOperationQueue
应该设置为6。例如,可以同时下载多个图像。
为什么是 6 而不是 10 或 100?
在名为 的框架SDWebImage
中,我们可以看到源代码如下:
- (instancetype)init {
self = [super init];
if (self) {
_maxConcurrentDownloads = 6;
_downloadTimeout = 15.0;
_executionOrder = SDWebImageDownloaderFIFOExecutionOrder;
_acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)];
}
return self;
}
此代码表示默认值为 6。 SDWebImage 参考 SDWebImageDownloaderConfig 类参考
的含义 maxConcurrentDownloads
与maxConcurrentOperationCount
(Apple-Docs-NSOperationQueue-maxConcurrentOperationCount)相同
为什么是 6 而不是 10 或 100?
SDWebImage
说它的编码器是通过实验:
参考:为什么 SDWebImageDownloader maxConcurrentOperationCount = 6?#1961
忽略实验, 从 iPhone 到 iPhone 13/13 Pro/13 Pro Max,iOS 平台上处理器核心的最大数量是 6 个,所以应该设置为 1 到 6 maxConcurrentOperationCount
。NSOperationQueue
苹果手机 | 首次发布 | 系统开启 | 处理器核心数 |
---|---|---|---|
苹果手机 | 2007年 | S (三星 S5L8900) | 1个核心 |
iPhone 3G | 2008年 | S (三星 S5L8900) | 1个核心 |
iPhone 3GS | 2009 | S(三星S5PC100 | 1个核心 |
iPhone 4 | 2010 | A4 | 1个核心 |
iPhone 4S | 2011 | A5 | 2个核心 |
iphone 5 | 2012 | A6 | 2个核心 |
iPhone 5S | 2013 | A7 | 2核 |
iPhone 6/6 加 | 2014 | A8 | 2个核心 |
iPhone 6s/6s plus/SE | 2015 | A9 | 2个核心 |
iPhone 7/加 | 2016 年 | A9 | 4核(使用2核) |
iPhone 8/加/X | 2017 | A11 | 6 个核心 = 2 个高功率 Monsoon 核心 + 4 个低功率 Mistral 核心 |
iPhone XS/XS MAX/XR | 2018 | A12 | 6 个核心 = 2 个高功率 Vortex 核心 + 4 个低功率 Tempest 核心 |
iPhone 11 /11 Pro/11 Pro Max | 2019 | A13 | 6 个核心 = 2 个性能 + 4 个效率核心 |
iPhone 12 /12 Pro/12 Pro Max | 2020 | A14 | 6 个核心 = 2 个性能 + 4 个效率核心 |
iPhone 13 /13 Pro/13 Pro Max | 2021 | A15 | 6 个核心 = 2 个性能 + 4 个效率核心 |
我们可以使用如下代码打印处理器内核的数量:
NSUInteger cpuCoresCount = [[NSProcessInfo processInfo] processorCount];
我们可以使用如下代码打印活动处理器内核的数量:
NSUInteger activeCPUCoresCount = [[NSProcessInfo processInfo] activeProcessorCount];
参考文档:Apple-Docs-NSProcessInfo-processorCount
_maxConcurrentDownloads
在 iPhone 平台上设置为 CPU 核心数是合理 的。至于进一步的评论,activeProcessorCount
可能会更好。
在名为 的框架中YYKit
,queueCount
设置为activeProcessorCount
.
#define MAX_QUEUE_COUNT 16
static int queueCount;
static dispatch_queue_t queues[MAX_QUEUE_COUNT];
static dispatch_once_t onceToken;
static int32_t counter = 0;
dispatch_once(&onceToken, ^{
queueCount = (int)[NSProcessInfo processInfo].activeProcessorCount;
queueCount = queueCount < 1 ? 1 : queueCount > MAX_QUEUE_COUNT ? MAX_QUEUE_COUNT : queueCount;
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
for (NSUInteger i = 0; i < queueCount; i++) {
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, 0);
queues[i] = dispatch_queue_create("com.ibireme.yykit.render", attr);
}
} else {
for (NSUInteger i = 0; i < queueCount; i++) {
queues[i] = dispatch_queue_create("com.ibireme.yykit.render", DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(queues[i], dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
}
}
});
int32_t cur = OSAtomicIncrement32(&counter);
if (cur < 0) cur = -cur;
return queues[(cur) % queueCount];
#undef MAX_QUEUE_COUNT
maxConcurrentOperationCount
为NSOperationQueue
1 ?它们设置maxConcurrentOperationCount
为一个意味着只能同时调用一个任务。
当只能同时调用一个任务时, maxConcurrentOperationCount
应设置为1。例如,只能同时动画一张GIF图像;只能同时播放一个视频。此外,只能同时解码一个视频/图像。