Swift 4.0:如何通过UserDefaults匹配值筛选特定用户发帖数据?
问题分析与修复方案
你现在遇到的核心问题是无法正确过滤出特定用户发布的帖子,导致TableView显示了数据库里的所有内容,我帮你梳理下问题根源和修复步骤:
关键问题点
- 结构体字段不匹配:你的
OverViewJob结构体里定义的用户ID字段是c_id,但代码里过滤和判断时却用了company_id,字段名不对应直接导致过滤条件永远不成立。 - 数据源未切换为过滤后的数组:你已经创建了
jobFilterOverviewArray存储过滤结果,但TableView的行数计算和单元格数据读取都还是用原始的jobOverViewArray,自然会显示所有内容。 - 错误的TableView刷新时机:在网络请求的循环里反复调用
reloadData完全没必要,应该在数据过滤完成后统一在主线程刷新一次。
修复后的完整代码
import UIKit struct OverViewJob: Decodable { let id: String let c_id: String // 注意:这里的字段名要和接口返回的key完全一致 let desig: String let exp_from: String let location: String let edu_qual: String } class OverviewViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{ var jobOverViewArray = [OverViewJob]() var jobFilterOverviewArray = [OverViewJob]() // 存储过滤后的目标数据 @IBOutlet weak var jobTableView: UITableView! override func viewDidLoad() { super.viewDidLoad() getJobOverviewData() // 提前打印当前用户ID,方便调试 if let userID = UserDefaults.standard.string(forKey: "user_type_id"){ print("当前登录用户ID=\(userID)") } } func getJobOverviewData() { guard let jobUrl = URL(string: "http://172.16.1.22/Get-Job-API/get-jobs/") else { print("无效的请求URL") return } URLSession.shared.dataTask(with: jobUrl) { (data, response, error) in do { // 先处理网络请求错误 if let error = error { print("请求数据失败:\(error)") return } guard let data = data else { print("未获取到任何数据") return } // 解码所有帖子数据 self.jobOverViewArray = try JSONDecoder().decode([OverViewJob].self, from: data) // 过滤当前用户的帖子 if let userID = UserDefaults.standard.string(forKey: "user_type_id"){ print("用于过滤的用户ID=\(userID)") // 这里用结构体里的c_id和用户ID匹配 self.jobFilterOverviewArray = self.jobOverViewArray.filter {$0.c_id == userID} print("过滤后帖子数量:\(self.jobFilterOverviewArray.count)") print("总帖子数量:\(self.jobOverViewArray.count)") } // 统一在主线程刷新TableView DispatchQueue.main.async { self.jobTableView.reloadData() } } catch { print("JSON解码失败:\(error)") } }.resume() } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 返回过滤后的数组长度,只显示目标帖子 return jobFilterOverviewArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ let cell = Bundle.main.loadNibNamed("VendorJobPostTableViewCell", owner: self, options: nil)?.first as! VendorJobPostTableViewCell let targetJob = jobFilterOverviewArray[indexPath.row] // 直接设置单元格内容,因为数组已经是过滤后的结果 cell.LabelOne.text = targetJob.desig cell.lblTwo.text = targetJob.exp_from cell.lblThree.text = targetJob.location cell.lblFour.text = targetJob.edu_qual return cell } }
额外说明
- 我添加了
guard let处理可选值,让代码更健壮,避免崩溃; - 现在你如果需要统计特定用户的帖子数量,直接读取
jobFilterOverviewArray.count即可; - 调试时可以通过打印的数量对比,确认过滤逻辑是否生效。
内容的提问来源于stack exchange,提问作者Audrey Rozario
相关产品推荐
相关产品推荐

