API的UICollectionView分页问题

时间:2019-03-13 22:57:02

标签: ios swift api uicollectionview

滚动uicollectionview时,我陷入了问题。我有这样的api:https://example.com/api/action=persons_detailed&page=0&limit=10

My API works like this 
... /page=0/limit=10
... /page=10/limit=10
... /page=20/limit=10

我想在滚动uicollection视图时更新下一个10个人,但是当我滚动时,它显示的是我的前10个人,然后是下10个人,也就是说,它不是在更新我的uicollection视图。

这是我的代码:

import Foundation

protocol ExampleService {
typealias PersonCompletion = (PagedResult<Person>) -> Void
func persons(page: Int, resultsPerPage: Int, completion: @escaping PersonCompletion)
}

class ExampleWebService: ExampleService {

  func persons(page: Int, resultsPerPage: Int, completion: @escaping (PagedResult<Person>) -> Void) {
    let url = URL(string: "https://avproduction.am/api/?action=persons_detailed&page=\(page)&limit=\(resultsPerPage)")!
    let task = session.dataTask(with: url) { (data, response, error) in
        guard let data = data else {
            return
        }
        do {
            try validate(response)

            let persons: [Person] = try parse(data)
            let personPage = PagedResult(pageNumber: page, results: persons)
            completion(personPage)
            print(data)
        }
        catch {
            print("Error: \(error)")
        }
    }
    task.resume()
  }
}

这是我的UICollectionView代码:

import UIKit

class PersonListViewController: UIViewController {

@IBOutlet weak var collectionView: UICollectionView!

var personPages: [PagedResult<Person>] = [] {
    didSet {
        DispatchQueue.main.async {
        self.collectionView.reloadData()
        }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    loadPersons()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    guard let selectedIndexPath = collectionView.indexPathsForSelectedItems?.first else {
        return
    }
    collectionView.deselectItem(at: selectedIndexPath, animated: animated)
}

var service = ExampleWebService()
private func loadPersons(page: Int = 0, resultsPerPage: Int = 10) {
    service.persons(page: page, resultsPerPage: resultsPerPage) { (personPage) in
        guard !self.loadedPersonPageNumbers.contains(page) else { return }
        self.personPages.append(personPage)
        self.updateLastIndexPath(personPage)
    }
}

private(set) var lastIndexPath: IndexPath?
private func updateLastIndexPath(_ personPage: PagedResult<Person>) {
    if personPage.results.isEmpty {
        lastIndexPath = nil
    }
    else {
        lastIndexPath = calculateLastIndexPath()
    }
}

private func calculateLastIndexPath() -> IndexPath? {
    guard let lastPage = personPages.last else { return nil }
    let section = lastPage.pageNumber
    let row = lastPage.results.count - 1
    return IndexPath(row: row, section: section)
}

fileprivate var loadedPersonPageNumbers: [Int] {
    return personPages.map { $0.pageNumber }
}

func person(at indexPath: IndexPath) -> Person? {
    guard indexPath.section < personPages.count else {
        return nil
    }
    guard indexPath.row < personPages[indexPath.section].results.count else {
        return nil
    }
    let page = personPages[indexPath.section]
    return page.results[indexPath.row]
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let personViewController = segue.destination as? PersonViewController,
        let selectedIndexPath = collectionView.indexPathsForSelectedItems?.first else {
        return
    }
    personViewController.person = person(at: selectedIndexPath)
}

 @IBAction func exitToPersonsView(segue: UIStoryboardSegue) {

 }
}

extension PersonListViewController: UICollectionViewDelegate {
 fileprivate var nextPageIndex: Int {
    guard let lastPage = personPages.last else {
        return 0
    }

    return lastPage.pageNumber.advanced(by: 10)
 }

 func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if indexPath == lastIndexPath {
        loadPersons(page: nextPageIndex)
    }
 }
}

我不对的地方只是显示0页和10个限制,然后显示10页和10个限制。

0 个答案:

没有答案