Вот расширение к MTKTextureLoader
(совместимо с Swift 5), которое загружает изображение с удаленного URL и создает из него текстуру металла. Он в основном соответствует той же схеме, что и существующий API асинхронной загрузки .
extension MTKTextureLoader {
static let errorDomain = "com.example.MTKTextureLoader.RemoteExtensions"
func newTexture(remoteURL url: URL, options: [MTKTextureLoader.Option : Any]? = nil, completionHandler: @escaping MTKTextureLoader.Callback) {
let downloadTask = URLSession.shared.downloadTask(with: URLRequest(url: url)) { (maybeFileURL, maybeResponse, maybeError) in
var anError: Swift.Error? = maybeError
if let tempURL = maybeFileURL, let response = maybeResponse {
if let cachePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first {
let cachesURL = URL(fileURLWithPath: cachePath, isDirectory: true)
let cachedFileURL = cachesURL.appendingPathComponent(response.suggestedFilename ?? NSUUID().uuidString)
try? FileManager.default.moveItem(at: tempURL, to: cachedFileURL)
return self.newTexture(URL: cachedFileURL, options: options, completionHandler: completionHandler)
} else {
anError = NSError(domain: MTKTextureLoader.errorDomain,
code: 1,
userInfo: [NSLocalizedDescriptionKey : "Unable to find user caches directory"])
}
} else {
anError = NSError(domain: MTKTextureLoader.errorDomain,
code: 2,
userInfo: [NSLocalizedDescriptionKey : "Download from URL failed"])
}
completionHandler(nil, anError)
}
downloadTask.resume()
}
}
Обратите внимание, что если ваше приложение находится в изолированной среде, вы должны включить «Исходящие подключения» в своих правах, если у вас нет Это уже сделано.
Кроме того, решение таких проблем, как загрузка, кэширование и загрузка текстур, не является наилучшей практикой, поэтому, если вы собираетесь загружать много удаленных файлов, я бы порекомендовал рефакторинг это к более общей системе кэширования удаленных ресурсов. Это только для демонстрационных целей.