【问题标题】:Data from two different JSONs into same struct in Swift来自两个不同 JSON 的数据到 Swift 中的同一个结构中
【发布时间】:2018-07-02 12:35:11
【问题描述】:

我有一个带有两个参数的结构:

class feedStruct: NSObject {
    var type: String?
    var date: String?

  //Irrelevant
}

然后我有两种不同类型的 JSON,一种从我的网页获取数据,另一种从 Twitter 获取数据。他们每个人都在我的UITableViewController 中自己的自定义单元格中显示这些数据。

它的意思是两个JSON都有上面的参数,所以网页JSON是从网页中获取日期,并把"web"作为feedStruct的类型。

Twitter JSON 也在做同样的事情,但 feedStruct 中的“twitter”类型。

来自 HomeModel.swift 的相关代码(从我的网页获取 JSON)

var jsonElement = NSDictionary()
let locations = NSMutableArray()
let feeds = NSMutableArray()

for i in 0 ..< jsonResult.count
{
    jsonElement = jsonResult[i] as! NSDictionary

    let location = LocationModel()
    let feed = feedStruct()

    //the following insures none of the JsonElement values are nil through optional binding
    if let name = jsonElement["name"] as? String,
        let title = jsonElement["title"] as? String,
        let article = jsonElement["article"] as? String,
        let id = jsonElement["id"] as? String,
        let category = jsonElement["category"] as? String,
        let unixstamp = jsonElement["unixstamp"] as? String
    {
        location.name = name
        location.title = title
        location.article = article
        location.id = id
        location.category = category
        location.unixstamp = unixstamp

        feed.date = unixstamp
        feed.type = "web"
    }

    locations.add(location)
    feeds.add(feed)
}

DispatchQueue.main.async(execute: { () -> Void in
    self.delegate.itemsDownloaded(items: locations)
    self.delegate.feedDatesDownloaded(items: feeds)
})

来自 twitterModel.swift 的相关代码(从 twitter 获取 JSON)

var jsonElement = NSDictionary()
let feeds = NSMutableArray()

for i in 0 ..< jsonResult.count
{
    jsonElement = jsonResult[i] as! NSDictionary

    let feed = feedStruct()

    //the following insures none of the JsonElement values are nil through optional binding
    if let unixstamp = jsonElement["created_at"] as? String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "EEE MMM d HH:mm:ss Z yyyy"
        let date = dateFormatter.date(from: unixstamp)!
        let calendar = Calendar.current
        let components = calendar.dateComponents([.year, .month, .day, .hour], from: date)
        let finalDate = calendar.date(from:components)

        let timestamp = finalDate?.timeIntervalSince1970
        let finalTimestamp = String(format: "%.0f", timestamp!)

        feed.date = finalTimestamp
        feed.type = "twitter"
    }

    feeds.add(feed)
}

DispatchQueue.main.async(execute: { () -> Void in
    self.delegate.twitterDownloaded(items: jsonResult)
    self.delegate.feedDatesDownloaded(items: feeds)
})

在feedTableViewController我有这个函数接收feedStruct的数据:

func feedDatesDownloaded(items: NSArray) {
    feedDates = items
    self.tableView.reloadData()
}

问题是,来自网络的数据首先被存储。当推特数据也被存储时,网络数据被删除。

有什么方法可以将它们都存储在同一个 feedStruct 中,并获得 54 个 feedDates.count(网络数据:34,twitter 数据:20)?

编辑 将其更改为 Array 而不是 NSMutable,并将 .add 替换为 .append。 现在它给了我两个字典,里面有一个字典,而且很多!甚至不能把所有的代码都放在这里,所以这只是一个例子:

[[Type: Optional("twitter"), Date: Optional("1516590000")]]
[[Type: Optional("web"), Date: Optional("1515970800"), Type: Optional("web"), Date: Optional("1515193200"), Type: Optional("web"), Date: Optional("1514847600"), Type: Optional("web"), Date: Optional("1514674800"), Type: Optional("web"), Date: Optional("1514329200"), Type: Optional("web"), Date: Optional("1513983600"), Type: Optional("web"), Date: Optional("1513551600"), Type: Optional("web"), Date: Optional("1513206000"), Type: Optional("web"), Date: Optional("1512946800"), Type: Optional("web"), Date: Optional("1512601200"), Type: Optional("web"), Date: Optional("1512169200"), Type: Optional("web"), Date: Optional("1511910000"), Type: Optional("web"), Date: Optional("1511650800"), Type: Optional("web"), Date: Optional("1511305200"), Type: Optional("web"), Date: Optional("1510441200"), Type: Optional("web"), Date: Optional("1509836400"), Type: Optional("web"), Date: Optional("1509577200"), Type: Optional("web"), Date: Optional("1509228000"), Type: Optional("web"), Date: Optional("1508709600"), Type: Optional("web"), Date: Optional("1508277600"), Type: Optional("web"), Date: Optional("1508277600"), Type: Optional("web"), Date: Optional("1508018400"), Type: Optional("web"), Date: Optional("1506895200"), Type: Optional("web"), Date: Optional("1506463200"), Type: Optional("web"), Date: Optional("1506204000"), Type: Optional("web"), Date: Optional("1505772000"), Type: Optional("web"), Date: Optional("1505599200"), Type: Optional("web"), Date: Optional("1505340000"), Type: Optional("web"), Date: Optional("1504994400"), Type: Optional("web"), Date: Optional("1503784800"), Type: Optional("web"), Date: Optional("1503525600"), Type: Optional("web"), Date: Optional("1503180000"), Type: Optional("web"), Date: Optional("1502834400"), Type: Optional("web"), Date: Optional("1502575200")], [Type: Optional("twitter"), Date: Optional("1516719600"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516590000"), Type: Optional("twitter"), Date: Optional("1516590000")]]
[[Type: Optional("web"), Date: Optional("1515970800"), Type: Optional("web"), Date: Optional("1515193200"), Type: Optional("web"), Date: Optional("1514847600"), Type: Optional("web"), Date: Optional("1514674800"), Type: Optional("web"), Date: Optional("1514329200"), Type: Optional("web"), Date: Optional("1513983600"), Type: Optional("web"), Date: Optional("1513551600"), Type: Optional("web"), Date: Optional("1513206000"), Type: Optional("web"), Date: Optional("1512946800"), Type: Optional("web"), Date: Optional("1512601200"), Type: Optional("web"), Date: Optional("1512169200"), Type: Optional("web"), Date: Optional("1511910000"), Type: Optional("web"), Date: Optional("1511650800"), Type: Optional("web"), Date: Optional("1511305200"), Type: Optional("web"), Date: Optional("1510441200"), Type: Optional("web"), Date: Optional("1509836400"), Type: Optional("web"), Date: Optional("1509577200"), Type: Optional("web"), Date: Optional("1509228000"), Type: Optional("web"), Date: Optional("1508709600"), Type: Optional("web"), Date: Optional("1508277600"), Type: Optional("web"), Date: Optional("1508277600"), Type: Optional("web"), Date: Optional("1508018400"), Type: Optional("web"), Date: Optional("1506895200"), Type: Optional("web"), Date: Optional("1506463200"), Type: Optional("web"), Date: Optional("1506204000"), Type: Optional("web"), Date: Optional("1505772000"), Type: Optional("web"), Date: Optional("1505599200"), Type: Optional("web"), Date: Optional("1505340000"), Type: Optional("web"), Date: Optional("1504994400"), Type: Optional("web"), Date: Optional("1503784800"), Type: Optional("web"), Date: Optional("1503525600"), Type: Optional("web"), Date: Optional("1503180000"), Type: Optional("web"), Date: Optional("1502834400"), Type: Optional("web"), Date: Optional("1502575200")], [Type: Optional("twitter"), Date: Optional("1516719600"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516590000"), Type: Optional("twitter"), Date: Optional("1516590000")]]
[[Type: Optional("web"), Date: Optional("1515970800"), Type: Optional("web"), Date: Optional("1515193200"), Type: Optional("web"), Date: Optional("1514847600"), Type: Optional("web"), Date: Optional("1514674800"), Type: Optional("web"), Date: Optional("1514329200"), Type: Optional("web"), Date: Optional("1513983600"), Type: Optional("web"), Date: Optional("1513551600"), Type: Optional("web"), Date: Optional("1513206000"), Type: Optional("web"), Date: Optional("1512946800"), Type: Optional("web"), Date: Optional("1512601200"), Type: Optional("web"), Date: Optional("1512169200"), Type: Optional("web"), Date: Optional("1511910000"), Type: Optional("web"), Date: Optional("1511650800"), Type: Optional("web"), Date: Optional("1511305200"), Type: Optional("web"), Date: Optional("1510441200"), Type: Optional("web"), Date: Optional("1509836400"), Type: Optional("web"), Date: Optional("1509577200"), Type: Optional("web"), Date: Optional("1509228000"), Type: Optional("web"), Date: Optional("1508709600"), Type: Optional("web"), Date: Optional("1508277600"), Type: Optional("web"), Date: Optional("1508277600"), Type: Optional("web"), Date: Optional("1508018400"), Type: Optional("web"), Date: Optional("1506895200"), Type: Optional("web"), Date: Optional("1506463200"), Type: Optional("web"), Date: Optional("1506204000"), Type: Optional("web"), Date: Optional("1505772000"), Type: Optional("web"), Date: Optional("1505599200"), Type: Optional("web"), Date: Optional("1505340000"), Type: Optional("web"), Date: Optional("1504994400"), Type: Optional("web"), Date: Optional("1503784800"), Type: Optional("web"), Date: Optional("1503525600"), Type: Optional("web"), Date: Optional("1503180000"), Type: Optional("web"), Date: Optional("1502834400"), Type: Optional("web"), Date: Optional("1502575200")], [Type: Optional("twitter"), Date: Optional("1516719600"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516590000"), Type: Optional("twitter"), Date: Optional("1516590000")]]
[[Type: Optional("web"), Date: Optional("1515970800"), Type: Optional("web"), Date: Optional("1515193200"), Type: Optional("web"), Date: Optional("1514847600"), Type: Optional("web"), Date: Optional("1514674800"), Type: Optional("web"), Date: Optional("1514329200"), Type: Optional("web"), Date: Optional("1513983600"), Type: Optional("web"), Date: Optional("1513551600"), Type: Optional("web"), Date: Optional("1513206000"), Type: Optional("web"), Date: Optional("1512946800"), Type: Optional("web"), Date: Optional("1512601200"), Type: Optional("web"), Date: Optional("1512169200"), Type: Optional("web"), Date: Optional("1511910000"), Type: Optional("web"), Date: Optional("1511650800"), Type: Optional("web"), Date: Optional("1511305200"), Type: Optional("web"), Date: Optional("1510441200"), Type: Optional("web"), Date: Optional("1509836400"), Type: Optional("web"), Date: Optional("1509577200"), Type: Optional("web"), Date: Optional("1509228000"), Type: Optional("web"), Date: Optional("1508709600"), Type: Optional("web"), Date: Optional("1508277600"), Type: Optional("web"), Date: Optional("1508277600"), Type: Optional("web"), Date: Optional("1508018400"), Type: Optional("web"), Date: Optional("1506895200"), Type: Optional("web"), Date: Optional("1506463200"), Type: Optional("web"), Date: Optional("1506204000"), Type: Optional("web"), Date: Optional("1505772000"), Type: Optional("web"), Date: Optional("1505599200"), Type: Optional("web"), Date: Optional("1505340000"), Type: Optional("web"), Date: Optional("1504994400"), Type: Optional("web"), Date: Optional("1503784800"), Type: Optional("web"), Date: Optional("1503525600"), Type: Optional("web"), Date: Optional("1503180000"), Type: Optional("web"), Date: Optional("1502834400"), Type: Optional("web"), Date: Optional("1502575200")], [Type: Optional("twitter"), Date: Optional("1516719600"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516716000"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516712400"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516708800"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516626000"), Type: Optional("twitter"), Date: Optional("1516590000"), Type: Optional("twitter"), Date: Optional("1516590000")]]

【问题讨论】:

  • 分配一些东西给像feedDates = items这样的变量会覆盖现有数据。即正常行为。如果您想保留现有数据,您必须 追加 或 insert 新数据。顺便说一句,不要在 Swift 中使用 NS(Mutable)... 集合类型。您正在丢弃类型信息。
  • @vadian 我也想到了append,但它不会让我这样做。如果我将NSMutable 更改为NSArray,它不会让我在feeds.add(feed) 中使用add() 函数
  • 也不要使用NSArray。使用 Swift 原生类型 Array 和 Dictionary。 var 使它们可变。
  • 在使用数组之后,我已经编辑了问题。

标签: ios json swift uitableview twitter


【解决方案1】:

首先。不要使用 Objective-C 集合,因为你丢弃了类型信息(参见前面的评论),它也可能导致一些性能问题。你的问题呢,我不明白。如果您想在更新表格视图之前同时从 Web 服务器和 twitter 加载数据,您可以使用 DispatchGroup。如果不是,请说明您到底想修复什么

【讨论】:

  • 我已经编辑了这个问题,在使用 Array 而不是 NSMutable 之后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2020-04-07
  • 2022-11-14
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
相关资源
最近更新 更多