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))
我正在我的小部件上显示股票图表(例如: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))