MangerKit

使用 MangerKit 浏览播客。 MangerKit Swift 包提供了一个 JSON HTTP 客户端,允许你从 manger-http 服务(一个缓存 RSS feed 代理)请求播客 feed 的组合范围。

MangerKit 被用于 Podest 播客应用中。

示例

请求三个播客的所有剧集。 你可以使用 since 属性限制时间范围。

import Foundation
import Patron
import MangerKit

let url = URL(string: "https://your.endpoint")!
let s = URLSession(configuration: .default)
let p = Patron(URL: url, session: s)
let svc = Manger(client: p)

struct Query: MangerQuery {
  let url: String
  let since: Date

  init(url: String, since: Date = Date(timeIntervalSince1970: 0)) {
    self.url = url
    self.since = since
  }
}

let queries: [MangerQuery] = [
  Query(url: "http://feeds.wnyc.org/newyorkerradiohour"),
  Query(url: "http://feed.thisamericanlife.org/talpodcast"),
  Query(url: "http://feeds.serialpodcast.org/serialpodcast")
]

try! svc.entries(queries) { result, error in
  print(error ?? result)
}

结果是一个未经处理的字典数组,[[String: AnyObject]]?,类型为 Any?,因为是 JSON。 请参考 manger-http 获取详细信息。

依赖

类型

MangerError

简单的错误类型也涵盖无效的查询。

enum MangerError: Error {
  case unexpectedResult(result: Any?)
  case cancelledByUser
  case noQueries
  case invalidQuery
  case niy
}

MangerQuery

现在,我看不出为什么查询不应该是 struct —— 为什么我们应该批判使用协议

protocol MangerQuery {
  var url: String { get }
  var since: Date { get }
}

MangerService

protocol MangerService {
  var client: JSONService { get }

  @discardableResult func feeds(
    _ queries: [MangerQuery],
    cachePolicy: NSURLRequest.CachePolicy,
    cb: @escaping (_ error: Error?, _ payload: [[String : AnyObject]]?) -> Void
  ) throws -> URLSessionTask

  @discardableResult func feeds(
    _ queries: [MangerQuery],
    cb: @escaping (_ error: Error?, _ payload: [[String : AnyObject]]?) -> Void
  ) throws -> URLSessionTask

  @discardableResult func entries(
    _ queries: [MangerQuery],
    cachePolicy: NSURLRequest.CachePolicy,
    cb: @escaping (_ error: Error?, _ payload: [[String : AnyObject]]?) -> Void
  ) throws -> URLSessionTask

  @discardableResult func entries(
    _ queries: [MangerQuery],
    cb: @escaping (_ error: Error?, _ payload: [[String : AnyObject]]?) -> Void
  ) throws -> URLSessionTask

  @discardableResult func version(
    _ cb: @escaping (_ error: Error?, _ service: String?) -> Void
  ) throws -> URLSessionTask
}

client (客户端)

var client: JSONService { get }

client 属性允许访问底层的 Patron 客户端,提供远程服务的主机名和状态。

测试

manger-http 运行的情况下,执行以下操作

$ swift test

安装

📦 将 https://github.com/michaelnisi/manger-kit 添加到你的包清单中。

许可证

MIT 许可证