-
kf 的其中之一调用方法
简单截图
1、 第一个参数 Source?
这是一个可选枚举啊 单单这个参数就很牛逼了 知识点非常多
kf.setImage(with: <#T##Source?#>,
placeholder: <#T##Placeholder?#>,
options: <#T##KingfisherOptionsInfo?#>,
progressBlock: <#T##DownloadProgressBlock?##DownloadProgressBlock?##(Int64, Int64) -> Void#>,
completionHandler: <#T##((Result<RetrieveImageResult, KingfisherError>) -> Void)?##((Result<RetrieveImageResult, KingfisherError>) -> Void)?##(Result<RetrieveImageResult, KingfisherError>) -> Void#>)
// 声明一个枚举 这是一个大范围的枚举(为什么这么说 不要着急 接着看下面)
public enum Source {
// 在大枚举中又套了一个小枚举 (这个枚举干啥用 不知道 回头明白了再补上)
public enum Identifier {
// 知识点 类型别名 typealias (typealias Value = UInt 这句话就是说给UInt 又起了一个名字叫 Value,他们两个是同一个人)
// 我不想吐槽这玩意 说实话 项目开发的话 这玩意 就没几个人用 写一个详细的注释 他不香嘛
// 类型别名还可以这样玩 typealias A = [B] or typealias C = {[D]} 这个就有意思了 这样数组字典可以看成一个实体来用了 牛逼了
public typealias Value = UInt
static var current: Value = 0
static func next() -> Value {
current += 1
return current
}
}
// 这里就有意思了 这领个case 都有参数 而这两个参数都是一个协议 Resource 、ImageDataProvider 都是一个协议 牛逼吧 太他妈强了
case network(Resource)
case provider(ImageDataProvider)
// 这里呢声明了一个属性 cacheKey 具体怎么用还不清楚
public var cacheKey: String {
switch self {
case .network(let resource): return resource.cacheKey
case .provider(let provider): return provider.cacheKey
}
}
// 这里呢一样 一个属性 url 具体怎么用还不清楚
public var url: URL? {
switch self {
case .network(let resource): return resource.downloadURL
case .provider(let provider): return provider.contentURL
}
}
}
// Source 的扩展
extension Source {
// 也是扩充了两个属性 但是这两个属性 有意思 都是一个遵循某个协议的参数
var asResource: Resource? {
guard case .network(let resource) = self else {
return nil
}
return resource
}
// 也是扩充了两个属性 但是这两个属性 有意思 都是一个遵循某个协议的参数
var asProvider: ImageDataProvider? {
guard case .provider(let provider) = self else {
return nil
}
return provider
}
}
1.1、好了接着回来看着第一个参数,第一个参数是URL(实际传值),他对应的是asResource 是这个属性,因为URL 只遵循了一个协议 Resource
public protocol Resource {
// 图片下载的字符串
var cacheKey: String { get }
// 图片下载的地址
var downloadURL: URL { get }
}
extension Resource {
public func convertToSource() -> Source {
return downloadURL.isFileURL ?
.provider(LocalFileImageDataProvider(fileURL: downloadURL, cacheKey: cacheKey)) :
.network(self)
}
}
public struct ImageResource: Resource {
public init(downloadURL: URL, cacheKey: String? = nil) {
self.downloadURL = downloadURL
self.cacheKey = cacheKey ?? downloadURL.absoluteString
}
public let cacheKey: String
public let downloadURL: URL
}
// 注意看这里 URL 遵循了这个协议
extension URL: Resource {
public var cacheKey: String { return absoluteString }
public var downloadURL: URL { return self }
}
2、 草他妹的看错了 忽略上面的逻辑 重新开始
截屏2021-06-07 下午3.59.48.png
2、第一个参数是 Resource? 传递过来的是一个url(实际上)
2.1 这里不得不先说一下两个协议 Resource、ImageDataProvider
// 首先 Resource、ImageDataProvider 这两个协议是干什么用的
1、Resource :资源
2、ImageDataProvider:图片数据提供者
3、LocalFileImageDataProvider 本地图片提供者 遵循 ImageDataProvider
4、KingfisherParsedOptionsInfo 结构体 解析信息
5、KingfisherManager 结构体 管理
6、RetrievingContext
7、RetryContext
8、Placeholder 也是协议
9、DownloadTask 结构体
10、WrappedTask 枚举
2.2 插播下小插曲
func loadDataDemo1(_ source:MNEResource?, _ str:String,_ str2:String){
print("###############################################################")
// 方法中套方法 然后在该方法中调用此方法 此处适用什么地方呢 适用于 警告 当我门一个方法中行为过长 而没办法拆分的时候 或者说拆除去不太好 这个更能理解上下文 或者将某些东西归位一类的时候 感觉这个可用性不大 还不如加注释拆分呢
func insideFunc(_ str:String){
print("牛逼不\(str)")
}
// 有点小牛逼的感觉 总感觉实用性不大
insideFunc(str2)
}
2.3 插播下小插曲
枚举 、结构体属于值类型存储于栈中 而单利属于引用类型 存储于堆中 我觉得枚举完全可以取代单利
网友评论