未在swiftui collectionview上加载图像
我正在尝试加载图像,但图像未加载 我设置了我的图像加载器未在swiftui collectionview上加载图像,swift,swiftui,Swift,Swiftui,我正在尝试加载图像,但图像未加载 我设置了我的图像加载器 class ImageLoader: ObservableObject { @Published var image: UIImage? private let url: URL private var cancellable: AnyCancellable? init(url: URL) { self.url = url } deinit { cancellable?.cancel() } fu
class ImageLoader: ObservableObject {
@Published var image: UIImage?
private let url: URL
private var cancellable: AnyCancellable?
init(url: URL) {
self.url = url
}
deinit {
cancellable?.cancel()
}
func load() {
cancellable = URLSession.shared.dataTaskPublisher(for: url)
.map { UIImage(data: $0.data) }
.replaceError(with: nil)
.receive(on: DispatchQueue.main)
.assign(to: \.image, on: self)
}
func cancel() {
cancellable?.cancel()
}
}
然后是异步映像结构
struct AsyncImage<Placeholder: View>: View {
@ObservedObject private var loader: ImageLoader
private let placeholder: Placeholder?
init(url: URL, placeholder: Placeholder? = nil) {
loader = ImageLoader(url: url)
self.placeholder = placeholder
}
var body: some View {
image
.onAppear(perform: loader.load)
.onDisappear(perform: loader.cancel)
}
private var image: some View {
placeholder
}
}
struct ProductSearhView: View {
@ObservedObject var model: SearchResultViewModel
var body: some View{
NavigationView {
List {
ForEach(0 ..< Global.productArry.count) { value in
CollectionView(model: self.model, data: Global.productArry[value])
}
}.navigationBarTitle("CollectionView")
}
}
}
struct CollectionView: View {
@ObservedObject var model: SearchResultViewModel
let data: Product
var body: some View {
VStack {
HStack {
Spacer()
AsyncImage(url: URL(string: self.data.productImageUrl)!, placeholder: Text("Loading ...")
).aspectRatio(contentMode: .fit)
Spacer()
}
HStack {
Spacer()
Text(self.data.name)
Spacer()
}
}.onAppear(perform:thisVal)
}
func thisVal (){
print(self.data.productImageUrl)
// https://i5.walmartimages.com/asr/113d660f-8b57-4ab8-8cfa-a94f11b121aa_1.f6bad4b281983e164dcf0a160571e886.jpeg?odnHeight=180&odnWidth=180&odnBg=ffffff
}
}
struct AsyncImage:视图{
@ObservedObject私有变量加载程序:ImageLoader
私人出租占位符:占位符?
初始化(url:url,占位符:占位符?=nil){
loader=ImageLoader(url:url)
self.placeholder=占位符
}
var body:一些观点{
形象
.onAppear(执行:loader.load)
.onDisappear(执行:loader.cancel)
}
私有var映像:一些视图{
占位符
}
}
结构产品searhview:视图{
@观察对象var模型:SearchResultViewModel
var body:一些观点{
导航视图{
名单{
ForEach(0..
除了图像加载,其他一切都正常。该图像仅显示占位符,而不显示图像。
要加载的示例图像url如下所示
我做错了什么?看起来你丢失了一张图像。 如果您有:
private var image: some View {
placeholder
}
你只会有一个占位符。
如果您将其更改为:
private var image: some View {
Group {
if loader.image != nil {
Image(uiImage: loader.image!)
.resizable()
} else {
placeholder
}
}
}
这意味着如果ImageLoader
已成功加载图像,它将使用加载的uiImage显示image
,否则它将显示占位符