PaginationTracker 2.0.0

PaginationTracker 2.0.0

David Jennes 维护。



  • David Jennes 和 Tom Knapen

PaginationTracker

Swift 5.0 Platform

一个用于跟踪集合或表格视图中的滚动并按需触发页面加载的小型库。

概述

一旦创建了一个跟踪器,您只需在视图将要显示单元格时通知它,它就会自动判断是否需要加载新页面。

使用方式

首先,在控制器的变量中创建一个分页跟踪器。在您的 viewDidLoad 中,确保启动分页。

final class NewsController: UITableViewController {
    private lazy var paginationTracker = PaginationTracker(
        nextPageCall: networkClient.loadNextNewsPage
    )

    override func viewDidLoad() {
        super.viewDidLoad()

        // Other setup...

        paginationTracker.startPaging { _ in }
    }
}

然后,在数据源中实现 willDisplay 代理函数,以便更新跟踪器。

extension NewsController {
    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        paginationTracker.track(indexPath: indexPath, for: tableView)
    }
}

下拉刷新

如果您要向视图添加下拉刷新功能,请确保触发分页重置。

extension NewsController {
    @IBAction private func refresh() {
        paginationTracker.reset(forceRefresh: true) { [weak self] _ in
            guard let self = self else { return }

            self.refreshControl?.endRefreshing()

            // reload data source, for example an FRC:
            try? self.source.controller.performFetch()
        }
    }
}

这里的 forceRefresh 参数设置为 true,因此在导入期间您可以检查是否需要删除旧数据。

extension News {
    func didImport(...) {
        let pagination: PaginationContext<News> = ...

        if pagination.forceRefresh {
            // Delete all old news items
        }
    }
}

分页上下文

下一页调用定义如下

typealias NextPageCall = (_ context: PaginationContextWithObject<Page, ContextObject>, _ handler: @escaping (Result<Page, Error>) -> Void) -> Void

如果在分页过程中,您需要某个上下文对象/信息,可以使用以下初始化器

final class NewsController: UITableViewController {
    private var category: NewsCategory

    private lazy var paginationTracker = PaginationTrackerWithContext(
        nextPageCall: networkClient.loadNextPage,
        contextObject: category
    )
}

现在您可以在下一页调用中访问此对象

func loadNextPage(_ context: PaginationContextWithObject<NewsPage, NewsCategory>, _ handler: @escaping (Result<NewsPage, Error>) -> Void) {
    // get pagination context object (a news category)
    let newsCategory = context.object
}

StatefulUI 集成

PaginationTracker 可以轻松集成到 StatefulUI 库中,您只需在初始化期间提供 StatefulViewController 即可。

final class NewsController: UITableViewController {
    private lazy var paginationTracker = PaginationTracker(
        nextPageCall: networkClient.loadNextNewsPage,
        statefulController: self
    )
}

extension NewsController: StatefulViewController {
    // Stateful implementation...
}

追踪器将自动设置正确的状态,无论是加载数据页面、无内容或发生错误。

安装

CocoaPods

将以下行添加到您的 Podfile。

pod "PaginationTracker", "~> 1.0"

然后使用 CocoaPods 1.4 或更高版本运行 pod install

贡献

  • 创建一些惊人的东西,让代码更好,添加一些功能,任何东西(这是最难的部分)。
  • 进行分叉
  • 创建新分支以进行更改
  • 将所有更改提交到您的分支
  • 提交拉取请求

致谢

PaginationTracker 由 David Jennes 提供。

许可证

PaginationTracker 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。