ios 小部件在 TimelineProvider 中加载远程图像 url?

ios widget load remote image url in TimelineProvider?

我正在我的小部件上显示股票图表(例如:https://example.com/my_img.png)。

作为对 SO & Apple dev 4rum 的调查,我找不到可行的解决方案。

据我所知,Widget 不支持异步图像加载,所以我的方法是在我们 getTimeline() 时获取图像,然后将图像数据传递给 Entry 以供稍后显示。

但是我无法让它工作,谁能指出我如何解决它?

简而言之,它不起作用!:

// Fetch first in getTimeline()
let imgData = Data(
  contentsOf: URL(string: "https://example.com/my_img.png")!
)!

// Then render it later in  View
Image(uiImage: UIImage(data: imgData))

这是我所有的伪代码:

func getTimeline(...) {
  var imageData = nil
  let url: URL = URL(string: "https://example.com/my_img.png")!
  if let imgData:Data = try? Data(contentsOf: url) {
    imageData = imgData
  }
  
  var entry = SimpleEntry(...)
  entry.imageData = imageData

  let timeline = Timeline(entries: [entry], policy: .atEnd)
  completion(timeline)
}

// Some where in the widget i'll show the imageData above
struct FIM_SV_Chart: View {
  let imageData: Data?
  
  var body: some View {
    if imageData != nil, let uiImage = UIImage(data: imageData!) {
      Image(uiImage: uiImage)
        .resizable()
        .aspectRatio(contentMode: .fit)
        .frame(width: 80, height: 26.0)
    } else {
      Image("EmptyChart")
        .resizable()
        .aspectRatio(contentMode: .fit)
        .frame(width: 80, height: 26.0)
    }
  }
}

非常感谢。

是我的错,我生成的图像不正确url所以 imgData 是 0 字节!

这会起作用:

// Fetch first in getTimeline()
let imgData = Data(
  contentsOf: URL(string: "https://example.com/my_img.png")!
)!

// Then render it later in  View
Image(uiImage: UIImage(data: imgData))