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

Swift中CollectionView加载WordPress分页帖子异常问题求助

问题修复方案

你的分页问题根源是数据覆盖而非追加,加上缺少重复请求控制,导致旧帖子丢失、页码跳变。以下是针对性修复步骤和代码:

核心问题点

  1. 每次获取新数据时用self.newsData = posts直接替换旧数组,导致1-10条帖子被覆盖
  2. page变量在请求前直接递增,若请求失败会导致页码混乱
  3. 无加载状态控制,滚动到最后一条时会重复触发分页请求
  4. UI刷新时机和线程处理不规范

修复后的完整代码修改

1. 添加状态控制变量

在ViewController类中新增两个变量:

var page = 1 // WP API的page参数从1开始,初始值设为1
var isLoading = false // 防止重复触发分页请求的标志

2. 修改帖子获取函数fetchPostData

func fetchPostData(completionHandler: @escaping ([Post]) -> Void ) {
    guard !isLoading else { return } // 正在加载时直接返回,避免重复请求
    isLoading = true
    
    let url = URL(string: "https://www.sikhnama.com/wp-json/wp/v2/posts/?categories=6&page=\(page)")!
    
    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        // 请求结束后不管成功失败,都重置加载状态
        defer {
            DispatchQueue.main.async {
                self.isLoading = false
            }
        }
        
        guard let data = data else {
            print("数据获取失败")
            completionHandler([])
            return
        }
        
        do {
            let postsData = try JSONDecoder().decode([Post].self, from: data)
            // 仅在请求成功后递增页码
            DispatchQueue.main.async {
                self.page += 1
            }
            completionHandler(postsData)
        } catch {
            print("JSON解析错误: \(error.localizedDescription)")
            completionHandler([])
        }
    }.resume()
}

3. 修正ViewDidLoad中的初始调用

override func viewDidLoad() {
    super.viewDidLoad()
    // 其他初始化代码(如注册cell、设置collectionView代理)...
    
    self.fetchPostData { (posts) in
        DispatchQueue.main.async {
            self.newsData = posts
            self.collectionView.reloadData()
        }
    }
}

4. 修改分页加载逻辑updateNextSet和willDisplay

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    // 仅在非加载状态且当前为最后一条数据时触发下一页
    if !isLoading && indexPath.row == self.newsData.count - 1 {
        updateNextSet()
    }
}

func updateNextSet(){
    self.fetchPostData { (posts) in
        DispatchQueue.main.async {
            // 追加新数据而非替换旧数据
            self.newsData.append(contentsOf: posts)
            self.collectionView.reloadData()
        }
    }
}

修复说明

  • 数据追加:用append(contentsOf:)替代直接赋值,保留旧帖子并添加新帖子,解决旧数据消失问题
  • 加载状态控制:isLoading变量避免滚动时多次触发分页请求,防止页码跳变
  • 页码管理:仅在请求成功后递增页码,避免请求失败导致的页码错误
  • 线程安全:所有UI操作均放在主线程执行,符合iOS开发规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:35:29