iOS WidgetKit:远程图像无法加载

Kon*_*nov 22 widgetkit swiftui ios14

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

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

  • SDWebImageSwiftUI
  • 翠鸟
  • 网址

所有这些都表明图像加载成功,但实际的小部件没有显示它。

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

感觉就像在 onSuccess 我需要触发 UI 失效?但是如何?

(因为它确实发生在我尝试的每个图像库中 - 我不认为它是库中的东西)

环境:

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

pra*_*rad 37

是的,正如康斯坦丁所说,不支持异步加载图像。有 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")
          }
        }
      }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

NetworkImage(url: url)
Run Code Online (Sandbox Code Playgroud)

  • 您是否打算将 url 属性设为私有?否则无法在其他地方设置。 (2认同)

Kon*_*nov 9

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

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