缓存 : 内存缓存、磁盘缓存
网络层 : download data
UI : placehold, 转场动画, 指示器
技术:
多线程技术: gcd 、 semophone 、 operationQueue
URLSession
NSCache
图片加工:
磁盘读写
开篇
#if os(macOS)
import AppKit
public typealias Image = NSImage
public typealias View = NSView
public typealias Color = NSColor
public typealias ImageView = NSImageView
public typealias Button = NSButton
#else
import UIKit
public typealias Image = UIImage
public typealias Color = UIColor
#if !os(watchOS)
public typealias ImageView = UIImageView
public typealias View = UIView
public typealias Button = UIButton
#else
import WatchKit
#endif
#endif
通过 typealias 设置别名,达到跨平台兼容的目的,如果你的framework需要跨平台,你需要这个。
public final class Kingfisher<Base> {
public let base: Base
public init(_ base: Base) {
self.base = base
}
}
/**
A type that has Kingfisher extensions.
*/
public protocol KingfisherCompatible {
associatedtype CompatibleType
var kf: CompatibleType { get }
}
public extension KingfisherCompatible {
public var kf: Kingfisher<Self> {
return Kingfisher(self)
}
}
extension Image: KingfisherCompatible { }
#if !os(watchOS)
extension ImageView: KingfisherCompatible { }
extension Button: KingfisherCompatible { }
#else
extension WKInterfaceImage: KingfisherCompatible { }
#endif
和rx类似通过一个泛型协议以及协议扩展达到创建类似命名空间的目的。不同的是这里用的是Class, rx用的是Struct ,但我本人还是倾向于使用Struct,因为每次调用.kf的时候,就会创建一个新的对象,但显然struct的开销要比Class低。