You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤Ticketmaster API图片?解决SwiftUI Widget重复图问题

问题解决方案

问题1:过滤Ticketmaster API获取的图片

Ticketmaster API返回的图片数组包含不同规格、用途的资源,你可以通过定义过滤规则筛选符合UI需求的图片:

  1. 先补全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"(缩略图)
}
  1. 在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
    }
}
  1. 在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重复显示同一张图片的解决方法

排查方向与修复步骤:

  1. 确保每个Event使用专属图片
    不要直接取images?.first,改用问题1中定义的suitableWidgetImage或filteredPrimaryImage,避免不同Event的首图重复:
// HomeViewWidget中替换原有代码
if let imageUrl = event.suitableWidgetImage?.url {
    // WebImage加载代码
}
  1. 验证事件去重逻辑
    替换当前的Set去重方式,使用你已实现的uniqueEvents(from:)方法,逻辑更清晰且保证顺序可控:
// loadEvents方法中修改
let uniqueEvents = uniqueEvents(from: loadedEvents).sorted { $0.name < $1.name }
  1. 排查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
    }
}
  1. 排除缓存干扰(调试用)
    如果是SDWebImage缓存导致的显示异常,可临时添加缓存清理代码:
// 在loadEvents的Task中添加
SDImageCache.shared.clearMemory()
SDImageCache.shared.clearDisk(onCompletion: nil)

内容的提问来源于stack exchange,提问作者Ben gann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:39:53