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 数据重新加载的主要内容,如果未能解决你的问题,请参考以下文章