Я хочу использовать нумерацию страниц в своем приложении. У меня есть такой API:IOS

Программируем под IOS
Ответить
Anonymous
 Я хочу использовать нумерацию страниц в своем приложении. У меня есть такой API:

Сообщение Anonymous »

Я хочу использовать нумерацию страниц в своем приложении. У меня есть такой API: https://example.com/api/?action=persons ... ed&limit=5
Я хочу использовать в своей коллекции 10 человек, а затем при прокрутке обновлять мой запрос. . Всего человек - 5200 человек, поэтому мне нужна нумерация страниц.
Это мой сервис API в моем проекте:

Код: Выделить всё

import Foundation

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

class ExampleWebService: ExampleService {

func persons(page: Int, resultsPerPage: Int, completion: @escaping (PagedResult) -> Void) {
let url = URL(string: "https://example.com/api/?action=persons_detailed&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()
}
}
< /code>
И это моя коллекция представление: < /p>
import UIKit

class PersonListViewController: UIViewController {

@IBOutlet weak var collectionView: UICollectionView!

var personPages: [PagedResult] = [] {
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) {
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: 1)
}

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if indexPath == lastIndexPath {
loadPersons(page: nextPageIndex)
}
}
}
Проблема в том, что когда я прокручиваю CollectionView, мне выводятся одни и те же первые 10 человек вместо обновления с 11 человек до 21 и т. д.


Подробнее здесь: https://stackoverflow.com/questions/551 ... -like-this
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»