Skip to content

Instantly share code, notes, and snippets.

@donchan922
Created April 4, 2020 01:26
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save donchan922/7eea3280a526783a3d4bef64485669af to your computer and use it in GitHub Desktop.
Save donchan922/7eea3280a526783a3d4bef64485669af to your computer and use it in GitHub Desktop.
SwiftUIでAPI呼び出しでJSONをパース&画像URLから画像を表示するサンプルコード
import SwiftUI
struct Dog: Codable, Identifiable {
public var id: String
public var status: String
enum CodingKeys: String, CodingKey {
case id = "message"
case status = "status"
}
init() {
self.id = ""
self.status = ""
}
}
public class DogFetcher: ObservableObject {
@Published var dog = Dog()
init() {
load()
}
func load() {
guard let url = URL(string: "https://dog.ceo/api/breeds/image/random") else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
DispatchQueue.main.async {
self.dog = try! JSONDecoder().decode(Dog.self, from: data!)
}
}.resume()
}
}
class ImageDownloader : ObservableObject {
@Published var downloadData: Data? = nil
func downloadImage(url: String) {
guard let imageURL = URL(string: url) else { return }
DispatchQueue.global().async {
let data = try? Data(contentsOf: imageURL)
DispatchQueue.main.async {
self.downloadData = data
}
}
}
}
struct URLImage: View {
let url: String
@ObservedObject private var imageDownloader = ImageDownloader()
init(url: String) {
self.url = url
self.imageDownloader.downloadImage(url: self.url)
}
var body: some View {
if let imageData = self.imageDownloader.downloadData {
let img = UIImage(data: imageData)
return Image(uiImage: img!).resizable()
} else {
return Image(systemName: "arrow.2.circlepath")
}
}
}
struct ContentView: View {
@ObservedObject var fetcher = DogFetcher()
var body: some View {
VStack {
URLImage(url: fetcher.dog.id)
.aspectRatio(contentMode: .fit)
Spacer()
Button(action: {
self.fetcher.load()
}) {
Text("Tap")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment