From ec3c72559e246b6eb0d29f22d370dc263b014d4b Mon Sep 17 00:00:00 2001 From: Alan Tai Date: Wed, 31 Mar 2021 00:40:29 +0800 Subject: [PATCH] #14 Update Unsplash API response to fix image not showing --- DevExcuses/Sources/DevExcusesView.swift | 56 +++++++++++------------ DevExcuses/Sources/Extensions.swift | 8 ++-- DevExcuses/Sources/Models/PhotoUrls.swift | 6 +-- DevExcuses/Sources/UnsplashClient.swift | 16 +++---- 4 files changed, 43 insertions(+), 43 deletions(-) diff --git a/DevExcuses/Sources/DevExcusesView.swift b/DevExcuses/Sources/DevExcusesView.swift index 429f79b..bb264ed 100644 --- a/DevExcuses/Sources/DevExcusesView.swift +++ b/DevExcuses/Sources/DevExcusesView.swift @@ -113,7 +113,7 @@ class DevExcusesView: ScreenSaverView { return } - client.random(size: self.frame.size, query: self.configs.imageTopics) + client.random(query: self.configs.imageTopics) .subscribe { event in if let error = event.error { self.update( @@ -125,34 +125,34 @@ class DevExcusesView: ScreenSaverView { self.setNeedsDisplay(self.frame) } else if let photo = event.element { - photo.download() - .observeOn(MainScheduler.instance) - .subscribeOn(CurrentThreadScheduler.instance) - .subscribe { event in - if let error = event.error { - self.update( - excuse : error.localizedDescription, - background: nil, - userName : nil, - profileUrl: nil - ) - } else if - let data = event.element, - let user = photo.user, - let userName = user.name, - let links = user.links, - let profileUrl = links.html { - self.update( - excuse : self.configs.quotes[self.configs.quotes.count.random()], - background: data, - userName : userName, - profileUrl: profileUrl - ) + photo.download(size: self.frame.size) + .observeOn(MainScheduler.instance) + .subscribeOn(CurrentThreadScheduler.instance) + .subscribe { event in + if let error = event.error { + self.update( + excuse : error.localizedDescription, + background: nil, + userName : nil, + profileUrl: nil + ) + } else if + let data = event.element, + let user = photo.user, + let userName = user.name, + let links = user.links, + let profileUrl = links.html { + self.update( + excuse : self.configs.quotes[self.configs.quotes.count.random()], + background: data, + userName : userName, + profileUrl: profileUrl + ) + } + + self.setNeedsDisplay(self.frame) } - - self.setNeedsDisplay(self.frame) - } - .disposed(by: self.disposeBag) + .disposed(by: self.disposeBag) } } .disposed(by: self.disposeBag) diff --git a/DevExcuses/Sources/Extensions.swift b/DevExcuses/Sources/Extensions.swift index 6387e82..dc42ea0 100644 --- a/DevExcuses/Sources/Extensions.swift +++ b/DevExcuses/Sources/Extensions.swift @@ -42,12 +42,12 @@ extension String { } extension Photo { - func download() -> Observable { + func download(size: CGSize) -> Observable { return Observable.create { observer in if - let urls = self.urls, - let custom = urls.custom, - let url = URL(string: custom) { + let urls = self.urls, + let raw = urls.raw, + let url = URL(string: raw + "&w=" + String(Int(size.width)) + "&h=" + String(Int(size.height))) { URLSession.shared.dataTask(with: url) { (data, response, error) in if let error = error { observer.onError(error as NSError) diff --git a/DevExcuses/Sources/Models/PhotoUrls.swift b/DevExcuses/Sources/Models/PhotoUrls.swift index 220301d..37a9264 100644 --- a/DevExcuses/Sources/Models/PhotoUrls.swift +++ b/DevExcuses/Sources/Models/PhotoUrls.swift @@ -1,13 +1,13 @@ struct PhotoUrls: Codable { enum CodingKeys: CodingKey { - case custom + case raw } - let custom: String? + let raw: String? init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - self.custom = try container.decodeIfPresent(String.self, forKey: .custom) + self.raw = try container.decodeIfPresent(String.self, forKey: .raw) } } diff --git a/DevExcuses/Sources/UnsplashClient.swift b/DevExcuses/Sources/UnsplashClient.swift index 06caee3..13ed410 100644 --- a/DevExcuses/Sources/UnsplashClient.swift +++ b/DevExcuses/Sources/UnsplashClient.swift @@ -3,21 +3,20 @@ import RxSwift final class UnsplashClient { private static let endPoint = "https://unsplash-api-proxy.appspot.com/" - func random(size: CGSize, query: [String]?) -> Observable { + func random(query: [String]?) -> Observable { return Observable.create { observer in - var queryItems: [URLQueryItem] = [ - URLQueryItem(name: "w", value: String(Int(size.width))), - URLQueryItem(name: "h", value: String(Int(size.height))) - ] - + var queryItems: [URLQueryItem]? + if let query = query { - queryItems.append(URLQueryItem(name: "query", value: query[query.count.random()])) + queryItems = [ + URLQueryItem(name: "query", value: query[query.count.random()]), + ] } var mutable = URLComponents(url: URL(string: UnsplashClient.endPoint)!, resolvingAgainstBaseURL: true)! mutable.path = "/photos/random" mutable.queryItems = queryItems - + URLSession.shared.dataTask(with: mutable.url!) { (data, response, error) in if let error = error { observer.onError(error as NSError) @@ -27,6 +26,7 @@ final class UnsplashClient { if response.isSuccess { do { let photo: Photo = try JSONDecoder().decode(Photo.self, from: data) + observer.onNext(photo) } catch let error as NSError { observer.onError(error)