【问题标题】:iOS WidgetKit: remote images fails to loadiOS WidgetKit:远程图像无法加载
【发布时间】:2020-11-15 01:19:16
【问题描述】:

我观察到一件奇怪的事情:在新的小部件中,即使图像已成功加载并放置在缓存中,也经常不显示远程图像

图片下载我试过了:

  • SDWebImageSwiftUI
  • 翠鸟
  • SwURL

都表示图片加载成功,但实际小部件没有显示。

struct TestWidgetEntryView : View {
    var entry: Provider.Entry

    var body: some View {
        WebImage(url: URL(string: "https://miro.medium.com/max/3840/0*TLqp5Uwavd-U_xrs.jpg"))
                        .onSuccess()
                        .resizable()
    }
}

在调试器的第二次运行 - 从缓存加载图像 - 我得到了显示的图像,但在初始运行时从来没有(?)。

感觉在 onSuccess 中我需要触发 UI 失效?但是怎么做呢?

(因为它确实发生在我尝试的每个图像库中 - 我不认为它在库中存在问题)

环境:

  • iOS 14 Beta 3(设备和模拟器)
  • Xcode 12 测试版 3
  • 在调试运行期间,内存使用量约为 15mb

【问题讨论】:

  • 我可以通过 RemoteImage 在小部件上显示图像,但有时由于小部件策略而无法显示。这里可能是同样的问题

标签: swiftui ios14 widgetkit


【解决方案1】:

是的,正如 Konstantin 所说,不支持异步加载图像。在小部件中加载网络图像有 2 个选项

  1. 要么获取 TimelineProvider 中的所有图像,然后直接将它们注入到视图中。

  2. 使用Data(contentsOf: url) 获取图像。这样它仍然可以同步获取它们,但代码更清晰。示例代码 -

    struct NetworkImage: View {
    
      private let url: URL?
    
      var body: some View {
    
        Group {
         if let url = url, let imageData = try? Data(contentsOf: url), 
           let uiImage = UIImage(data: imageData) {
    
           Image(uiImage: uiImage)
             .resizable()
             .aspectRatio(contentMode: .fill)
          } 
          else {
           Image("placeholder-image")
          }
        }
      }
    
    }
    

这个视图可以简单地像这样使用 -

NetworkImage(url: url)

【讨论】:

  • 您是否打算将 url 属性设为私有?否则不能在别处设置。
【解决方案2】:

知道了:它根本不受支持,您的目标是在 TimelineProvider 中加载图像:

https://developer.apple.com/forums/thread/652581

【讨论】:

  • 这对我很有帮助,我为此苦苦挣扎了一整晚,谢谢!
  • 这是否意味着我不能使用 SwiftUI 组件(例如:github.com/dmytro-anokhin/url-image)来渲染图像?我应该先在 TImelineProvider 中将图像二进制文件预下载到本地吗?
猜你喜欢
  • 2023-04-05
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2020-11-20
  • 2018-11-11
  • 2011-02-10
相关资源
最近更新 更多