最近做了一个批量添加商品的功能,一次性添加了商品成功后,首先刷新页面,把商品刷新出来,再另开一个线程一张张上传图片。
此时出现了一个bug。前面几个上传的商品总是有几个商品图片是加载不出来的。我使用的是SDWebImage去加载图片。报错提示:NSURLErrorDomain Code=-1100。但是,实际上,我把图片的地址拷贝到浏览器中,是可以看到的,然后换一个手机登录查看也是可以看到的。那么说明地址是正确的。
我继续查找NSURLErrorDomain Code=-1100的错误原因。发现NSURLErrorDomain 的错误编码如下图:
typedef enum
{
NSURLErrorUnknown = -1, //未知
NSURLErrorCancelled = -999, //取消
NSURLErrorBadURL = -1000, //错误URL
NSURLErrorTimedOut = -1001, //超时
NSURLErrorUnsupportedURL = -1002, //不支持URL
NSURLErrorCannotFindHost = -1003, //找不到主机
NSURLErrorCannotConnectToHost = -1004, //无法连接到主机
NSURLErrorDataLengthExceedsMaximum = -1103, //数据长度超过最大值
NSURLErrorNetworkConnectionLost = -1005, //网络连接丢失
NSURLErrorDNSLookupFailed = -1006, //DNS查询失败
NSURLErrorHTTPTooManyRedirects = -1007, //HTTP重定向太多
NSURLErrorResourceUnavailable = -1008, //资源不可用
NSURLErrorNotConnectedToInternet = -1009, //未连接到互联网的NSURL错误
NSURLErrorRedirectToNonExistentLocation = -1010, //重定向到不存在的位置
NSURLErrorBadServerResponse = -1011, //服务器响应错误
NSURLErrorUserCancelledAuthentication = -1012,//用户取消身份验证
NSURLErrorUserAuthenticationRequired = -1013,
NSURLErrorZeroByteResource = -1014, //0字节资源
NSURLErrorCannotDecodeRawData = -1015,//无法解码原始数据
NSURLErrorCannotDecodeContentData = -1016,//无法解码内容数据
NSURLErrorCannotParseResponse = -1017, //无法解析响应
NSURLErrorFileDoesNotExist = -1100,//文件不存在
NSURLErrorFileIsDirectory = -1101,//文件目录
NSURLErrorNoPermissionsToReadFile = -1102,//没有权限读取文件
NSURLErrorSecureConnectionFailed = -1200, //安全连接失败
NSURLErrorServerCertificateHasBadDate = -1201, //服务器证书错误日期
NSURLErrorServerCertificateUntrusted = -1202,//服务器证书不可信
NSURLErrorServerCertificateHasUnknownRoot = -1203,//服务器证书有未知的根
NSURLErrorServerCertificateNotYetValid = -1204,//服务器证书无效
NSURLErrorClientCertificateRejected = -1205,//客户端证书拒绝
NSURLErrorClientCertificateRequired = -1206, //客户端证书要求
NSURLErrorCannotLoadFromNetwork = -2000,//无法从网络加载
NSURLErrorCannotCreateFile = -3000,//无法创建文件
NSURLErrorCannotOpenFile = -3001,//无法打开文件
NSURLErrorCannotCloseFile = -3002,//无法关闭文件
NSURLErrorCannotWriteToFile = -3003,//无法写入文件
NSURLErrorCannotRemoveFile = -3004,//无法删除文件
NSURLErrorCannotMoveFile = -3005,//无法移动文件
NSURLErrorDownloadDecodingFailedMidStream = -3006,//下载解码失败中流
NSURLErrorDownloadDecodingFailedToComplete = -3007//下载解码失败
}
-1100错误是文件不存在。但是之前我已经证实了地址是存在的。此时我想会不会是SDWebImage的加载机制的问题。于是在网上一搜,还真与SDWebImage有关。原来,SDWebImage默认选项的是加载失败后,不会重新加载。而我之前写的逻辑,在添加商品成功后就刷新页面去显示,此时图片还没有上传成功,于是,就得到了-1100,文件不存在的错误。但是之后,由于SDWebImage加载过,所以不会再去请求加载,于是,图片就一直显示不出来,一直是-1100的错误。
解决方法:
SDWebImage中加载图片的方法如下:
- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock {
[self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock];
}
在sd_setImageWithURL方法中,将参数options:(SDWebImageOptions),设置成SDWebImageRetryFailed就行了。具体swift调用代码如下:
self.sd_setImage(with: URL, placeholderImage: placeholder, options: .retryFailed) { (_, error, _, _) in
if error != nil {
print("url:\(url) error:\(error?.localizedDescription ?? "")")
}
}
之后运行,便可以看见,商品图片随着一次次的上传,一张张加载显示出来了。问题解决。