我正在使用 Alamofire + AlamofireObjectMapper 以及 ObjectMapper 处理 JSON API (Reddit)。我正在创建模型,并提出了一个未按预期工作的解决方案。我会尽力解释...
我收到的 JSON 响应有一个基类Thing
,如下所示
class Thing<T where T:Mappable>: Mappable {
var id: String?
var name: String?
var kind: String?
var data: T?
required init?(_ map: Map) {}
func mapping(map: Map) {
id <- map["id"]
name <- map["name"]
kind <- map["kind"]
data <- map["data"]
}
}
该data
属性取决于我提出的请求类型。在这种特殊情况下,它的类型应该Listing
如下。
class Listing<T where T: Mappable>: Mappable {
var before: String?
var after: String?
var modhash: String?
var children: [Thing<T>]?
required init?(_ map: Map) {}
func mapping(map: Map) {
before <- map["before"]
after <- map["after"]
modhash <- map["modhash"]
children <- map["children"]
}
}
该children
属性是一个Thing
对象数组,但是data
在这种情况下具有不同的类型Post
class Post: Mappable {
var author: String?
var creationDate: Int?
var name: String?
var numberOfComments: Int?
var score: Int?
var text: String?
var stickied: Int?
var subreddit: String?
var title: String?
var url: String?
var preview: Images?
required init?(_ map: Map) {}
func mapping(map: Map) {
author <- map["author"]
creationDate <- map["created_utc"]
name <- map["name"]
numberOfComments <- map["num_comments"]
score <- map["score"]
text <- map["selftext"]
stickied <- map["stickied"]
subreddit <- map["subreddit"]
title <- map["title"]
url <- map["url"]
preview <- map["preview"]
}
}
使用 AlamofireObjectMapper 扩展,解析对我的自定义模型的 JSON 响应,我们使用
public func responseObject<T : Mappable>(keyPath: String? = default, completionHandler: Alamofire.Response<T, NSError> -> Void) -> Self
它期望一个泛型类型。Response<Thing<Listing<Post>>, NSError>
我将使用如下定义的类型...
RedditAPIService.requestSubReddit(subReddit: nil, withSortType: .Hot, afterPost: nil, postsAlreadyShown: nil).responseObject { (response: Response<Thing<Listing<Post>>, NSError>) -> Void in
if let value = response.result.value {
print(value.kind)
}
}
我看到的问题是Listing
对象上的数据损坏。
我期望children
对象中只有 1 个值,而不是 > 900 亿!
我知道我可以继承Thing
并Listing
使用特定类型,但我也很好奇为什么这不能按预期工作。有任何想法吗?谢谢!