Setup for Assets downloading(資源下載設(shè)置)
這里我們?nèi)稳幌蚰阏故救绾蝸韺?shí)現(xiàn)一個簡單的資源下載設(shè)置。首先,我們創(chuàng)建一個新的TargetType協(xié)議的實(shí)現(xiàn)
fileprivate static let assetDir: URL = {
let directoryURLs = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return directoryURLs.first ?? NSTemporaryDirectory()
}()
enum Asset: TargetType {
case star
case checkmark
var baseURL: URL { /* ... */ }
var assetName: String {
switch self {
case .star: return "star.png"
case .checkmark: return "checkmark.png"
}
}
var path: String {
return "/assets/" + assetName
}
var localLocation: URL {
return assetDir.appendingPathComponent(assetName)
}
var downloadDestination: DownloadDestination {
return { _, _ in return (self.localLocation, .removePreviousFile) }
}
var task: Task {
return .download(downloadDestination)
}
/*
Rest of TargetType
*/
}
然后使用AssetLoader來包裝MoyaProvider
final class AssetLoader {
let provider = MoyaProvider<Assets>()
init() { }
func load(asset: Asset, completion: ((Result<URL, MoyaError>) -> Void)? = nil) {
if FileManager.default.fileExists(atPath: asset.localLocation.path) {
completion?(.success(asset.localLocation))
return
}
provider.request(asset) { result in
switch result {
case .success:
completion?(.success(asset.localLocation))
case let .failure(error):
return completion?(.failure(error))
}
}
}
}
這就完畢了.然后使用AssetLoader
final class TestViewModel {
let loader: AssetLoader
init(loader: AssetLoader = AssetLoader()) {
self.loader = loader
}
func loadImage() {
loader.load(asset: .star) { result in
// handle the result
}
}
}
總結(jié) 這小節(jié)的核心:
- 創(chuàng)建好一個資源下載器AssetLoader(它包裝了MoyaProvider對象)
- 創(chuàng)建好一個資源下載的TargetType。
- 如何使用AssetLoader