如何按指定顺序排序含关联值的HomeScreenDataType枚举数组?
解决方案
步骤1:给枚举添加排序优先级属性
在你的HomeScreenDataType枚举中新增一个计算属性,用来标记每个case对应的排序权重,对应你需要的固定顺序:
enum HomeScreenDataType { case topBanners([TopBanner]) case bottomBanner([BottomBanner]) case productCategory([ProductCategory]) case favouriteStores([FavouriteStores]) case subscriber([Subscriber]) // 定义每个case的排序优先级 var sortOrder: Int { switch self { case .topBanners: return 0 case .bottomBanner: return 1 case .productCategory: return 2 case .favouriteStores: return 3 case .subscriber: return 4 } } }
步骤2:等待所有异步请求完成后排序
因为是多异步请求并行获取数据,推荐用DispatchGroup监听所有请求的完成状态,确保所有数据都添加到数组后再执行排序操作:
let dispatchGroup = DispatchGroup() var homeScreenData = [HomeScreenDataType]() // 示例:发起TopBanner数据请求 dispatchGroup.enter() fetchTopBanners { banners in if let banners = banners { homeScreenData.append(.topBanners(banners)) } dispatchGroup.leave() } // 同理发起另外4个异步请求,每个请求前后都要调用enter()和leave() // 所有请求完成后执行排序 dispatchGroup.notify(queue: .main) { // 按sortOrder属性排序数组 homeScreenData.sort { $0.sortOrder < $1.sortOrder } // 此处可执行UI更新或后续业务逻辑 }
补充说明
- 每个异步请求必须正确配对
enter()和leave(),保证DispatchGroup的计数逻辑正常,否则notify回调不会触发。 - 排序逻辑直接依赖枚举的
sortOrder属性,后续如果需要调整顺序,只需修改对应case的返回值即可,维护成本低。
内容的提问来源于stack exchange,提问作者Ganesh Pawar
相关产品推荐
相关产品推荐

