-
Notifications
You must be signed in to change notification settings - Fork 0
/
AsyncImage.swift
62 lines (54 loc) · 1.73 KB
/
AsyncImage.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import SwiftUI
// In SwiftUI 3.0, Apple introduced AsyncImage view to render images from remote url.
// Here’s how you can use it in your app with a placeholder until your image is loaded.
struct Thumbnail: Codable, Identifiable {
let albumId: Int
let id: Int
let url: String
}
struct ContentView: View {
@State private var thumbnails: [Thumbnail] = []
var body: some View {
NavigationView {
List(thumbnails) { thumbnail in
HStack {
AsyncImage(url: URL(string: thumbnail.url)!, content: { image in
image
.resizable()
.scaledToFill()
.frame(width: 72, height: 72)
}) {
PlaceholderView()
}
.clipShape(RoundedRectangle(cornerRadius: 13))
Text("Image \(thumbnail.id)")
}
}
.navigationTitle("My App")
}
.task {
Task {
await loadThumbnails()
}
}
}
func loadThumbnails() async {
do {
let url = URL(string: "https://jsonplaceholder.typicode.com/photos")!
let (data, _) = try await URLSession.shared.data(from: url)
thumbnails = try JSONDecoder().decode([Thumbnail].self, from: data)
} catch {
thumbnails = []
}
}
}
struct PlaceholderView: View {
var body: some View {
ZStack {
ProgressView()
}
.frame(width: 72, height: 72)
.background(Color.gray.opacity(0.1))
.clipShape(RoundedRectangle(cornerRadius: 13))
}
}