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

Posted

技术标签:

【中文标题】处理 JSON 分页,并将数据添加到表视图?【英文标题】:Handling JSON pagination, and adding data to a table view? 【发布时间】:2019-02-17 18:00:55 【问题描述】:

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


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

如您所见,data 包含一个对象列表,在本例中是一个 Posts 列表。这是我的 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 响应。我希望它是通用的,因为我有其他分页响应返回 Users 而不是 Posts 以及其他对象。

这是我目前的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 响应以获取 Posts 列表,然后将它们附加到 var posts = [Post]() 变量?我需要对我的Pagination 课程进行任何更改吗?

【问题讨论】:

我认为如果不了解 ObjectMapper(也许还有 Realm)就无法回答这个问题? 我不确定,我认为不知道Realm或Objectmapper的情况下应该可以回答。 我最近创建了一个应用程序,它使用了具有分页功能的 API。如果你知道总页数,我建议你看看“UITableViewDataSourcePrefetching”。它是专门为使用分页的tableView/collectionView设计的。这样您就不需要手动附加到您的数据数组并跟踪您现在所在的页面等等。 Ray Wenderlich 有一个很好的例子。 【参考方案1】:

一旦你有了你的 json,就很容易使用对象映射器来解析它:

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

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

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

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

【讨论】:

以上是关于处理 JSON 分页,并将数据添加到表视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Json 数据发送到表视图数组?迅速

使用 SwiftJSON 将 Alamofire 结果 JSON 加载到表视图中

将数据从集合视图传递到表视图

JSON 未加载到表视图中

当我将核心数据添加到表视图时,我的应用程序崩溃了

当添加到表视图境界项目出现两次