0

我通过我的 API 接收到一些分页的 JSON 响应,看起来像这样:

第 1 页:

{
    "count": 96,
    "next": "http://127.0.0.1:8000/id=5/?page=2",
    "previous": null,
    "results": [
        {
            "id": 10,
            "book_name": "Book name",
            "book_id": 70,
            "chapter_number": 1,
            "verse": "Verse title here",
            "verse_number": 1,
            "chapter": 96
        },
        {
            "id": 198,
            "book_name": "Book Name",
            "book_id": 70,
            "chapter_number": 8,
            "verse": "Text here",
            "verse_number": 5,
            "chapter": 103
        }
    ]
}

当我浏览分页结果时,即调用:http://127.0.0.1:8000/id=5/?page=2 我将在results数组中获得新值。

第2页:

{
    "count": 96,
    "next": "http://127.0.0.1:8000/id=5/?page=3",
    "previous": "http://127.0.0.1:8000/id=5/",
    "results": [
        {
            "id": 206,
            "book_name": "Book on Second page",
            "book_id": 70,
            "chapter_number": 8,
            "verse": "yadda yadda",
            "verse_number": 13,
            "chapter": 103
        },
        {
            "id": 382,
            "book_name": "Book on second page..",
            "book_id": 70,
            "chapter_number": 15,
            "verse": "Verse here",
            "verse_number": 12,
            "chapter": 110
        }
    ]
}

我将如何构建我的结构/修复我的解码,以便我可以在results更新的同时附加来自 JSON的值countnext以及previous当我经历..?page=3..?page=4

目前,我的结构如下所示:

struct VersesSearchResult: Decodable {
    var results: [Verse]
    var count: Int
    var next: String?
    var previous: String?
}

在进行解码时,我不确定将结果附加到结构和update nextpreviouscount. 到目前为止我得到了这个

...
let verses = try JSONDecoder().decode(VersesSearchResult, from: safeData)
DispatchQueue.main.async {
    // somehow need to get this to work - not entirely sure how
    // where results gets appended, while the rest in the JSON values gets updated
   // obviously I can't do as below:
    self.verseSearchResult.append(contentsOf: verses.results)
    self.verseSearchResult = verses
}
...
4

1 回答 1

0

解码为该类型的临时实例,然后将这些属性处理到您的主实例中。根据您要如何处理数据,它看起来像这样

extension VersesSearchResult {

  mutating func update(with new: VersesSearchResult) {
    results.append(new)
    count = new.count
    next = new.next
    prev = new.prev
  }
}

然后在你的完成块中

let newVerses = try JSONDecoder().decode(VersesSearchResult, from: safeData)
self.verses.update(with: newVerses)

如果需要强制更新到主线程。

您还应该使用 ado...catch或其他方法处理“尝试”中的失败。

于 2021-10-03T23:07:34.260 回答