데이터가 변경될 때 마다 UI를 변경해주려면 여러가지 방법이 있다. 그중에서 Observable 클래스를 이용해서 데이터 바인딩을 구현해볼 것이다.
class Observable<T> {
typealias Listener = (T) -> Void
var listener: Listener?
func bind(_ listener: Listener?) {
self.listener = listener
listener?(value)
}
var value: T {
didSet {
listener?(value)
}
}
init(_ value: T) {
self.value = value
}
}
class UserModelService {
static let shared = UserModelService()
var userModelPath: Observable<URL?> = Observable(nil)
func getTempUserModel(url: String) {
let destinationPath: DownloadRequest.Destination = { _, _ in
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0];
let fileURL = documentsURL.appendingPathComponent("my_mesh.obj")
return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
let url = K.flaskURL + url
AF.download(url, to: destinationPath)
.downloadProgress { progress in
}
.responseData { response in
switch response.result {
case .success:
print("Success")
// self.userModelPath.value = self.getFilePathInDocuments(fileName: "my_mesh.obj")
self.userModelPath.value = response.fileURL
case .failure(let e):
print(e)
}
}
}
}