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

Yelp API数据接入与数组传递问题及CDYelpFusionKit Cocoapods安装冲突技术问询

解决方案:Yelp API数据传递与CDYelpFusionKit安装问题

问题1:Yelp API数据无法传入指定数组 & 获取20家餐厅数据

先拆解你代码里的核心问题,一步步解决:

1.1 调整请求参数获取20家餐厅

你当前的search任务里limit参数设为1了,直接改成20就能拉取20条餐厅数据:

case let .search(loc):
    return .requestParameters(parameters: ["location": loc, "term": "restaurants", "limit": 20], encoding: URLEncoding.queryString)

1.2 修复数据传递与线程安全问题

你的回调里直接赋值Restaurants.viewModels = viewModels!有两个隐患:

  • Moya的request回调默认跑在后台线程,如果这个数组要用于UI展示,必须切回主线程操作
  • try?会吞掉解码错误,你没法排查数据解析失败的原因

修正后的API调用代码如下:

let service = MoyaProvider<YelpService.BuisnessesProvider>()
let jsonDecoder = JSONDecoder()
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
service.request(.search(loc: "98117")) { result in
    switch result {
    case .success(let response):
        do {
            let root = try jsonDecoder.decode(Root.self, from: response.data)
            let viewModels = root.businesses.compactMap(RestaurantListViewModel.init)
            print("成功获取 \(viewModels.count) 家餐厅")
            // 切回主线程更新数组(绑定UI必须这么做,避免线程冲突)
            DispatchQueue.main.async {
                Restaurants.viewModels = viewModels
                // 这里可以加UI刷新逻辑,比如 tableView.reloadData()
            }
        } catch {
            print("解码失败:\(error.localizedDescription)")
            print("原始返回数据:\(String(data: response.data, encoding: .utf8) ?? "无法解析")")
        }
    case .failure(let error):
        print("请求错误:\(error.localizedDescription)")
    }
}

1.3 额外优化:避免强制解包

你代码里用了print(viewModels!)和Restaurants.viewModels = viewModels!,如果API返回格式异常导致root为nil,会直接崩溃。建议用可选绑定做安全处理:

if let viewModels = root?.businesses.compactMap(RestaurantListViewModel.init) {
    DispatchQueue.main.async {
        Restaurants.viewModels = viewModels
    }
} else {
    print("未获取到有效餐厅数据")
}

问题2:CDYelpFusionKit CocoaPods构建错误(Multiple commands produce)

这个错误是Xcode检测到重复的框架嵌入命令导致的,按以下步骤排查修复:

2.1 基础清理重置

  • 关闭Xcode
  • 删除DerivedData:直接前往路径/Users/mcrich/Library/Developer/Xcode/DerivedData/Pickt-fpbpwbgjikipuabwpwmkowpgeelv删除整个文件夹
  • 终端执行pod deintegrate && pod install重新集成Pods

2.2 检查Build Phases中的重复条目

打开Xcode -> 你的Target(Pickt) -> Build Phases:

  • 查看Copy Files阶段,有没有手动添加CDYelpFusionKit.framework的条目,如果有就删除(CocoaPods的[CP] Embed Pods Frameworks脚本会自动处理框架嵌入)
  • 确保Link Binary With Libraries里只有Pods自动添加的CDYelpFusionKit.framework

2.3 调整Swift标准库嵌入设置

在Target的Build Settings里搜索Always Embed Swift Standard Libraries,设置为No(CocoaPods会自动管理这个配置,手动开启容易引发冲突)

2.4 更新CocoaPods版本

如果以上方法无效,更新CocoaPods到最新版本试试:

sudo gem install cocoapods
pod update

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:13:14