处理JSON分页,并将数据添加到表视图?

时间:2019-02-17 18:00:56

标签: swift realm swift4 objectmapper moya

我收到以下格式的JSON响应:

{
    "current_page":1,
    "data":[
        {
            "id":1,
            "title":"Title 1"
        },
        {
            "id":2,
            "title":"Title 2"
        },
        {
            "id":3,
            "title":"Title 3"
        }
    ]
}

如您所见,data包含一个对象列表,在这种情况下,包含Post个列表。这是我的Realm / Objectmapper Post类:

import RealmSwift
import ObjectMapper

class Post: Object, Mappable {
    let id = RealmOptional<Int>()
    @objc dynamic var title: String? = nil

    required convenience init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {

    }
}

我创建了一个通用类(我不确定它写的正确)来处理Pagination响应。我希望它是通用的,因为在其他对象中,我还有其他的分页响应返回User而不是Post

这是我当前的Pagination课:

import ObjectMapper

class Pagination<T: Mappable>: Mappable {
    var data: [T]?

    required convenience init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {
        data <- map["data"]
    }
}

但是,我不确定我是否正确地编写了该课程。

这是我调用返回分页数据的端点的类(我已经删除了不相关的代码):

var posts = [Post]()

provider.request(.getPosts(page: 1)) { result in
    switch result {
    case let .success(response):
        do {
            let json = try JSONSerialization.jsonObject(with: response.data, options: .allowFragments)

            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // Not sure what to do here to handle and retrieve the list of Posts
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

            // Eventually, I need to append the posts to the variable
            // self.posts.append(pagination.data)

            // Reload the table view's data
            self.tableView.reloadData()
        } catch {
            print(error)
        }
    case let .failure(error):
        print(error)
        break
    }
}

如何正确处理JSON响应才能获取Post的列表,然后将其附加到var posts = [Post]()变量中?我需要对我的Pagination类进行任何更改吗?

1 个答案:

答案 0 :(得分:0)

一旦有了json,就可以使用对象映射器轻松解析它:

let pagination = Mapper<Pagination<Post>>().map(JSONObject: json)

可以进一步概括,我以直接引用为例。您的Pagination类还可以保存当前页面索引值。

我认为您还缺少mapping(map:)类中Post函数的实现,应该是这样的:

func mapping(map: Map) {
    title <- map["title"]
}