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

Swift 4.0:如何通过UserDefaults匹配值筛选特定用户发帖数据?

问题分析与修复方案

你现在遇到的核心问题是无法正确过滤出特定用户发布的帖子,导致TableView显示了数据库里的所有内容,我帮你梳理下问题根源和修复步骤:

关键问题点

  1. 结构体字段不匹配:你的OverViewJob结构体里定义的用户ID字段是c_id,但代码里过滤和判断时却用了company_id,字段名不对应直接导致过滤条件永远不成立。
  2. 数据源未切换为过滤后的数组:你已经创建了jobFilterOverviewArray存储过滤结果,但TableView的行数计算和单元格数据读取都还是用原始的jobOverViewArray,自然会显示所有内容。
  3. 错误的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:28:01