Skip to content

Commit 8fd5ea2

Browse files
committed
Use Nuke LazyImage for AsyncImage implementation
1 parent f17b76b commit 8fd5ea2

File tree

3 files changed

+63
-25
lines changed

3 files changed

+63
-25
lines changed

Package.resolved

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ let package = Package(
3030
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.5.0"),
3131

3232
.package(url: "https://github.com/swiftlang/swift-syntax.git", from: "600.0.1"),
33+
34+
.package(url: "https://github.com/kean/Nuke", from: "12.8.0"),
3335
],
3436
targets: [
3537
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
@@ -38,9 +40,11 @@ let package = Package(
3840
name: "LiveViewNative",
3941
dependencies: [
4042
.product(name: "AsyncAlgorithms", package: "swift-async-algorithms"),
43+
.product(name: "Nuke", package: "Nuke"),
44+
.product(name: "NukeUI", package: "Nuke"),
4145
.product(name: "LiveViewNativeCore", package: "liveview-native-core"),
4246
"LiveViewNativeMacros",
43-
"LiveViewNativeStylesheet"
47+
"LiveViewNativeStylesheet",
4448
],
4549
plugins: [
4650
.plugin(name: "BuiltinRegistryGeneratorPlugin"),

Sources/LiveViewNative/Views/Images/AsyncImage.swift

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
//
77

88
import SwiftUI
9+
#if canImport(Nuke) && canImport(NukeUI)
10+
import Nuke
11+
import NukeUI
12+
#endif
913

1014
/// Displays an image asynchronously loaded from a URL.
1115
///
@@ -69,37 +73,58 @@ struct AsyncImage<Root: RootRegistry>: View {
6973
}
7074

7175
var asyncImage: some View {
76+
#if canImport(Nuke) && canImport(NukeUI)
77+
LazyImage(
78+
url: url.flatMap({ URL(string: $0, relativeTo: context.url) }),
79+
transaction: transaction
80+
) { state in
81+
let phase = switch state.result {
82+
case .none:
83+
AsyncImagePhase.empty
84+
case .some(.success(let response)):
85+
AsyncImagePhase.success(Image(uiImage: response.image))
86+
case .some(.failure(let error)):
87+
AsyncImagePhase.failure(error)
88+
}
89+
asyncImageContent(phase)
90+
}
91+
#else
7292
SwiftUI.AsyncImage(
7393
url: url.flatMap({ URL(string: $0, relativeTo: context.url) }),
7494
scale: scale,
7595
transaction: transaction
7696
) { phase in
77-
SwiftUI.Group {
78-
switch phase {
79-
case .empty:
80-
if $liveElement.hasTemplate(.asyncImagePhase(.empty)) {
81-
$liveElement.children(in: .asyncImagePhase(.empty))
82-
} else {
83-
SwiftUI.ProgressView().progressViewStyle(.circular)
84-
}
85-
case .success(let image):
86-
if $liveElement.hasTemplate(.asyncImagePhase(.success)) {
87-
$liveElement.children(in: .asyncImagePhase(.success))
88-
} else {
89-
image
90-
}
91-
case .failure(let error):
92-
if $liveElement.hasTemplate(.asyncImagePhase(.failure)) {
93-
$liveElement.children(in: .asyncImagePhase(.failure))
94-
} else {
95-
SwiftUI.Text(error.localizedDescription)
96-
}
97-
@unknown default:
98-
EmptyView()
97+
asyncImageContent(phase)
98+
}
99+
#endif
100+
}
101+
102+
func asyncImageContent(_ phase: AsyncImagePhase) -> some View {
103+
SwiftUI.Group {
104+
switch phase {
105+
case .empty:
106+
if $liveElement.hasTemplate(.asyncImagePhase(.empty)) {
107+
$liveElement.children(in: .asyncImagePhase(.empty))
108+
} else {
109+
SwiftUI.ProgressView().progressViewStyle(.circular)
110+
}
111+
case .success(let image):
112+
if $liveElement.hasTemplate(.asyncImagePhase(.success)) {
113+
$liveElement.children(in: .asyncImagePhase(.success))
114+
} else {
115+
image
116+
}
117+
case .failure(let error):
118+
if $liveElement.hasTemplate(.asyncImagePhase(.failure)) {
119+
$liveElement.children(in: .asyncImagePhase(.failure))
120+
} else {
121+
SwiftUI.Text(error.localizedDescription)
99122
}
123+
@unknown default:
124+
EmptyView()
100125
}
101-
.environment(\.asyncImagePhase, phase)
102126
}
127+
.environment(\.asyncImagePhase, phase)
103128
}
104129
}
105130

0 commit comments

Comments
 (0)