测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布上次发布 | 2016 年 12 月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✓ |
由 Luciano Marisi 维护。
这个库背后的想法是通过协议定义用户如何在他们的应用程序中定义资源,这些协议定义了资源的存储位置以及如何获取它们。然后可以采用库提供的通用服务类型(有或没有操作)获取这些资源。
请注意,这个库仍在开发中,因此目前仅支持 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
的资源操作。