1

我正在使用 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对象上的数据损坏。

调试IMG

我期望children对象中只有 1 个值,而不是 > 900 亿!

我知道我可以继承ThingListing使用特定类型,但我也很好奇为什么这不能按预期工作。有任何想法吗?谢谢!

4

0 回答 0