如何过滤Ticketmaster API图片?解决SwiftUI Widget重复图问题
问题解决方案
问题1:过滤Ticketmaster API获取的图片
Ticketmaster API返回的图片数组包含不同规格、用途的资源,你可以通过定义过滤规则筛选符合UI需求的图片:
- 先补全
EventImage的数据结构(匹配API返回字段):
struct EventImage: Codable, Hashable { let url: String let width: Int let height: Int let ratio: String // 如"16:9"、"3:2" let type: String // 如"primary"(主图)、"thumbnail"(缩略图) }
- 在
Event扩展中添加过滤逻辑,按需筛选图片:
extension Event { // 获取符合Widget尺寸的主图(3:2比例,最小250px宽) var filteredPrimaryImage: EventImage? { images?.first(where: { $0.type == "primary" && $0.ratio == "3:2" && $0.width >= 250 }) } // 备选:筛选大尺寸图片,优先选分辨率高的 var suitableWidgetImage: EventImage? { images?.filter { $0.width >= 250 && $0.height >= 250 } .sorted(by: { $0.width > $1.width }) .first } }
- 在
HomeViewWidget中使用过滤后的图片:
if let imageUrl = event.filteredPrimaryImage?.url { ZStack(alignment: .bottomLeading) { WebImage(url: URL(string: imageUrl)) .resizable() .aspectRatio(contentMode: .fill) .frame(width: 250, height: 250) .clipped() .cornerRadius(10) // 其他UI元素 } }
问题2:Widget重复显示同一张图片的解决方法
排查方向与修复步骤:
- 确保每个Event使用专属图片
不要直接取images?.first,改用问题1中定义的suitableWidgetImage或filteredPrimaryImage,避免不同Event的首图重复:
// HomeViewWidget中替换原有代码 if let imageUrl = event.suitableWidgetImage?.url { // WebImage加载代码 }
- 验证事件去重逻辑
替换当前的Set去重方式,使用你已实现的uniqueEvents(from:)方法,逻辑更清晰且保证顺序可控:
// loadEvents方法中修改 let uniqueEvents = uniqueEvents(from: loadedEvents).sorted { $0.name < $1.name }
- 排查API返回数据问题
在loadEvents中添加打印,确认每个Event的图片URL是否真的重复:
limitedEvents.forEach { event in print("Event: \(event.name), ID: \(event.id), Image URL: \(event.suitableWidgetImage?.url ?? "无图片")") }
如果打印显示不同Event的URL相同,说明API返回的部分事件共用图片,可进一步调整过滤规则(比如取数组中第二个符合条件的图片):
extension Event { var nonDuplicateWidgetImage: EventImage? { images?.filter { $0.width >= 250 && $0.height >= 250 } .dropFirst(1) // 跳过首图,取第二个 .first } }
- 排除缓存干扰(调试用)
如果是SDWebImage缓存导致的显示异常,可临时添加缓存清理代码:
// 在loadEvents的Task中添加 SDImageCache.shared.clearMemory() SDImageCache.shared.clearDisk(onCompletion: nil)
内容的提问来源于stack exchange,提问作者Ben gann
相关产品推荐
相关产品推荐

