let response = Observable<[Book]>.create { observer in
let session = URLSession.shared
let task = session.dataTask(with: url) { [weak self] (data, response, error) in
defer {
DispatchQueue.main.async { [weak self] in
self?.listTableView.reloadData()
UIApplication.shared.isNetworkActivityIndicatorVisible = false
}
}
if let error = error {
print(error)
observer.onError(error)
return
}
guard let httpResponse = response as? HTTPURLResponse else {
print("Invalid Response")
observer.onCompleted()
return
}
guard (200...299).contains(httpResponse.statusCode) else {
print(httpResponse.statusCode)
observer.onCompleted()
return
}
guard let data = data else {
fatalError("Invalid Data")
observer.onCompleted()
return
}
do {
let decoder = JSONDecoder()
let bookList = try decoder.decode(BookList.self, from: data)
if bookList.code == 200 {
observer.onNext(bookList.list)
} else {
observer.onNext([])
}
} catch {
observer.onError(error)
}
}
task.resume()
return Disposables.create{
task.cancel()
}
}.asDriver(onErrorJustReturn: [])
URLSession 이 완료/실패에 따라서 onNext,completed, Error이벤트를 방출하고 UI바인딩을 하기위해 asDriver로 리턴함.