LoadIt 0.2.0

LoadIt 0.2.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2016 年 12 月
SwiftSwift 版本3.0
SPM支持 SPM

Luciano Marisi 维护。



LoadIt 0.2.0

  • 作者:
  • Luciano Marisi

此仓库已过时,请使用 TABResourceLoader 代替。

LoadIt

codecov.io

这个库背后的想法是通过协议定义用户如何在他们的应用程序中定义资源,这些协议定义了资源的存储位置以及如何获取它们。然后可以采用库提供的通用服务类型(有或没有操作)获取这些资源。

请注意,这个库仍在开发中,因此目前仅支持 JSON 类型资源。

这种模式的原始想法在 Protocol oriented loading of resources from a network service in Swift 中解释。

简单示例

假设您需要从 https://:8000/<continent>.json 服务器获取这个 JSON

{
  "cities": [{
    "name": "Paris"
  }, {
    "name": "London"
  }]
}

城市 Swift 模型可以看起来像这样

struct City {
  let name: String
}

一些基本的解析逻辑

extension City {
  init?(jsonDictionary: [String : AnyObject]) {
    guard let parsedName = jsonDictionary["name"] as? String else {
      return nil
    }
    name = parsedName
  }
}

定义资源

可以创建一个 CitiesResource 来定义城市的来源以及如何解析基本端点

private let baseURL = NSURL(string: "https://:8000/europe.json")!

struct CitiesResource: NetworkJSONResourceType {
  typealias Model = [City]

  let url: NSURL

  init(continent: String) {
    url = baseURL.URLByAppendingPathComponent("\(continent).json")
  }

  //MARK: JSONResource
  func modelFrom(jsonDictionary jsonDictionary: [String: AnyObject]) -> [City]? {
    guard let
      citiesJSONArray = jsonDictionary["cities"] as? [[String: AnyObject]]
      else {
        return []
    }
    return citiesJSONArray.flatMap(City.init)
  }

}

获取资源

使用提供的 NetworkJSONResourceService 从网络服务检索您的 CitiesResource

let europeResource = CitiesResource(continent: "europe")
let networkJSONService = NetworkJSONResourceService<CitiesResource>()
networkJSONService.fetch(resource: europeResource) { [weak self] result in
  // do something with the result
}

或者

如果使用 NSOperation,定义一个 typealias 以方便操作

private typealias CitiesNetworkResourceOperation = ResourceOperation<NetworkJSONResourceService<CitiesResource>>

使用 CitiesResource 创建操作

let europeResource = CitiesResource(continent: "europe")
let citiesNetworkResourceOperation = CitiesNetworkResourceOperation(resource: europeResource) { [weak self] operation, result in
  // do something with the result
}

将操作添加到队列中

let operationQueue = NSOperationQueue()
operationQueue.addOperation(citiesNetworkResourceOperation)

创建自定义服务和操作

目前仅提供 NetworkJSONResourceService 服务。在未来的更新中,可能会附带更多默认服务。在此期间,用户可以通过符合 ResourceServiceType 来创建自己的服务。同样,尽管 ResourceOperation 可能能满足大多数需求,开发者可以选择拥有自己的符合 ResourceOperationType 的资源操作。