24

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

对于图像下载,我尝试过:

  • 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
4

2 回答 2

43

是的,正如康斯坦丁所说,不支持异步加载图像。有 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)
于 2020-08-13T03:33:13.297 回答
9

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

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

于 2020-07-25T08:29:29.400 回答