SwiftPaginator 2.1.0

SwiftPaginator 2.1.0

测试已测试
语言语言 SwiftSwift
许可证 自定义
发布最新发布2017年7月
SwiftSwift 版本3.0
SPM支持 SPM

Chris Simpson 维护。



SwiftPaginator

🐧 Linux 已准备就绪

Paging

SwiftPaginator 是一个基于块的 Swift 类,帮助管理分页资源。受到 NMPaginator 这个 Objective-C 类的启发。SwiftPaginator 充分利用 blocks 和泛型,因此不需要 subclassing 和 delegates。

特性

  • [x] 使用 Swift 编写
  • [x] 使用泛型,无需子类化。
  • [x] 基于 blocks,无需委托。
  • [x] 100% 测试覆盖率
  • [x] 完全文档化
  • [x] 支持 iOS | OSX | WatchOS | tvOS | Linux 并已测试就绪
  • [x] 可通过 CocoaPods 安装
  • [x] 可通过 Carthage 安装
  • [x] 可通过 Swift Package Manager 安装

如何安装

Swift Package Manager (OS X + Linux)

您可以使用 Swift Package Manager 通过添加正确的描述到您的 Package.swift 文件中来安装 SwiftPaginator

import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    targets: [],
    dependencies: [
        .Package(url: "https://github.com/apocolipse/SwiftPaginator.git", versions: "1.0.0" ..< Version.max)
    ]
)

注意,Swift Package Manager 仍在早期设计和开发阶段,有关更多信息,请查看其 GitHub 页面

手动安装

SwiftPaginator.swift 复制到您的项目中

如何使用

虽然基于 NMPaginator,但 SwiftPaginator 不需要 subclassing 或委托。使用泛型和 blocks,Paginator 类会为您处理所有事情。

设置 Paginator

import SwiftPaginator

let source = [["one", "two"], ["three", "four"]]

简单示例

let stringPaginator = Paginator<String>(pageSize: 2, fetchHandler: { (paginator, page, pageSize) in
    paginator.receivedResults(source[page], total: 4)
}, resultsHandler: { (_, _) in
    self.tableView.reloadData()
})

更完整的示例

let stringPaginator = Paginator<String>(pageSize: 2, fetchHandler: {
      (paginator: Paginator, page: Int, pageSize: Int) in

      // implement how to fetch results, must call paginator.receivedResults(_:total:) or paginator.failed()
      if page < source.count {
        paginator.receivedResults(source[page], total: 4)
      } else {
        paginator.failed()
      }

    }, resultsHandler: { (paginator, results) in
        // Handle results
        print(results) // results for the given page
        print(paginator.results) // all results

    }, resetHandler: { (paginator) in
        // callback for a reset, Optional
        tableView.reloadData()
    }, failureHandler: { (paginator) in
        // callback for a failure, Optional
        self.presentFailureAlert()
    })
在视图控制器中设置

声明属性

class ViewController: UIViewController {
    var stringPaginator: Paginator<String>?
...

确保在 viewDidLoad() 中调用 fetchFirstPage(),在需要加载更多结果的地方(例如,滚动到滚动视图的底部或点击按钮)使用 fetchNextPage()

override func viewDidLoad() {
    super.viewDidLoad()
    stringPaginator = ...
    stringPaginator.fetchFirstPage()
}

func loadMoreResults() {
    stringPaginator.fetchNextPage()
}

获取页面

使用 fetchFirstPage()fetchNextPage() 来调用获取操作。 fetchFirstPage() 会调用 reset(),然后 fetchNextPage() 内部调用。

stringPaginator.fetchNextPage()  // Use this one for most cases
stringPaginator.fetchFirstPage() // will reset paginator

以下将详细介绍如何在 fetchHandler 中定义获取行为 注意Paginator 不允许同时请求。当 paginator.requestStatus.InProgress 时,进入的请求将被忽略。

重置分页器

要重置分页器并清除所有存储结果,只需要调用

stringPaginator.reset()

以下关于 resetHandler 的详细信息说明了如何对 reset() 做出响应

状态

requestStatus 属性存储一个类型为 RequestStatus 的枚举,包含 3 个状态,分别为 .Done.InProgress.None。在获取第 1 页之前,状态为 .None,获取后变为 .InProgress(此时正在处理异步请求),否则为 .Done

块解释

所有块都有一个 paginator: Paginator<T> 参数,这是分页器内部的 self 的引用,您可以在块中使用它,而无需考虑作用域问题。初始化方法中传递的所有块在初始化后都可以访问和更改,例如。

paginator.fetchHandler   = ...
paginator.resultsHandler = ...
paginator.resetHandler   = ...
paginator.failureHandler = ...

fetchHandler - 必需项

fetchHandler 块定义了获取新页面的行为。它从内部由 fetchNextPage() 调用。 注意:您必须在 fetchHandler 中调用 paginator.receivedResults(_:total:)paginator.failed()

paginator.fetchHandler = {
    (paginator, page, pageSize) in

    APIClient.getResources() { (response, failure) in
        if failure {
            paginator.failed()
        } else {
            paginator.receivedResults(response.results, total: response.total)
        }
    }
}

resultsHandler - 必需项

resultsHandler 允许您处理正在进入的新结果批次。尽管它需要被定义,但它可以是空的,即

...
resultsHandler: { (_, _) in },
...

但通常用于通知视图控制器更新 UI。

...
resultsHandler: { (paginator, results) in
    self.handleNewResults(results)
    self.tableView.reloadData()
},
...

注意:传递给 resultsHandlerresults 是针对该特定 页面 的结果,要访问所有结果,请使用 paginator.results

resetHandler - 可选项

resetHandler 允许您执行诸如更新 UI 或其他必须在数据源更改后执行的活动等活动。这是可选的。

paginator.resetHandler = {
    (paginator) in
    self.tableView.reloadData()
}

failureHandler - 可选项

failureHandler 允许您独立于 fetchHandler 对失败做出反应。这不是必需的,但是一种将获取逻辑与失败反应逻辑分离的好方法。

paginator.resetHandler = {
    (paginator) in
    self.presentFailedAlert()
}