UIPickerView 未使用最新的 JSON 数据重新加载

Posted

技术标签:

【中文标题】UIPickerView 未使用最新的 JSON 数据重新加载【英文标题】:UIPickerView Not Reloading with the Latest JSON Data 【发布时间】:2020-12-14 13:19:24 【问题描述】:

基本上我希望下面的 UIPickerView 显示来自 URL 的 JSON 提供的最新选项 - 似乎重新安装应用程序会获取最新数据,但之后它是相同的。有没有我没有做的事情来正确重新加载数据?

以下是我目前的代码:

struct Model : Decodable 
    let model : String

viewDidLoad

let url = URL(string: "https://www.test.com/test/test")!
let dataTask = URLSession.shared.dataTask(with: url)  data, _, error in
    if let error = error  print(error); return 
    do  
        let result = try JSONDecoder().decode([Model].self, from: data!)
        self.models = result.map$0.model
        DispatchQueue.main.async 
          self.pickerview.reloadAllComponents()
        
     catch  print(error) 

dataTask.resume()

使用的选取器数据源方法:

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
    return models.count


func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
    return models[row]


func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
    TextField.text = models[row]

我认为在 Viewdidload 中执行此操作会解决此问题,但如果在 URL 中更新 JSON,UIPickerView 列表仍会显示旧的选项列表。

DispatchQueue.main.async 
              self.pickerview.reloadAllComponents()
            

【问题讨论】:

【参考方案1】:

这实际上取决于如何使用此视图。例如,如果此视图是您应用的主视图,则 viewDidLoad 将在该视图首次构建后显示,然后可能再也不会显示。

如果这个视图是一个被重新创建的子视图(一个新的对象被初始化),那么viewDidLoad将被再次调用。

如果您处于第一种情况,请尝试viewWillAppear 看看是否能满足您的需求。如果子视图覆盖了整个视图,它将在您从子视图返回时调用。如果您正在执行更复杂的操作,则必须使用其他触发器(计时器?或者可能是来自子视图的委托)来重新加载数据。

如果这不是问题 - 检查以确保您的代码实际被调用并且您从 URL 获取更新的 JSON。如果代码被调用,并且你得到了旧的 JSON,它可能会被缓存。

【讨论】:

我已经尝试将代码添加到 viewWillAppear 中,结果相同。我知道 JSON 数据正在使用更多数据进行更新,但除非重新安装应用程序,否则它不会出现在 PickerView 中。这让我觉得它正在被缓存 - 是否可以清除缓存? let result = try JSONDecoder().decode([Model].self, from: data!) 上放置一个断点,看看你是否一遍又一遍地获得相同的数据——如果是,在堆栈溢出时在搜索栏中输入“URLSession cache”——有很多关于它的问题(但首先要确保这是问题)

以上是关于UIPickerView 未使用最新的 JSON 数据重新加载的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSON 数组填充 UIPickerView? [关闭]

使用 UIPickerView 从 json 加载数据

UIPickerView 为空,数据源为 JSON 数组

使用远程 JSON 数组填充 UIPIckerView

UIPickerView 无法显示 JSON 数组数据

ios swift 2如何用json数据填充uipickerview [重复]