【问题标题】:Count number of results from Firebase (Swift)计算来自 Firebase (Swift) 的结果数
【发布时间】:2019-12-06 14:29:50
【问题描述】:

我有一个 Firebase 数据库正在运行,它存储 iOS 应用程序用户报告的数据;例如,可以报告一家杂货店,然后将其存储在数据库中。在商店名称旁边,报告的时间(四舍五入为 15 分钟)也以reportedTime 的形式存储在数据库中。

现在我想知道,在一天中的哪个时间 - 即早上(06:00 - 12:00 点),中午(12:00 - 18:00 点),晚上(18:00 - 24:00 点)或晚上(00:00 - 06: 00 点) – 提交了多少报告。

我从 firebase 获取值,将它们存储在模型中,因此可以访问,例如,report.reportTime 返回类似“2019-07-27 19:30:00 +0000 " 作为每个单独报告的字符串。

例如,我如何计算 00:00:00 到 06:00:00 之间的报告数量?

我正在使用 SwiftValidators 并尝试了以下方法(不要评判我!):

if Validator.contains("00:00:00").apply(report.reportTime) || Validator.contains("00:15:00").apply(report.reportTime) || Validator.contains("00:30:00").apply(report.reportTime) || Validator.contains("00:45:00").apply(report.reportTime) || Validator.contains("01:00:00").apply(report.reportTime) || Validator.contains("01:15:00").apply(report.reportTime) || Validator.contains("01:30:00").apply(report.reportTime) || Validator.contains("01:45:00").apply(report.reportTime) || Validator.contains("02:00:00").apply(report.reportTime) || Validator.contains("02:15:00").apply(report.reportTime) || Validator.contains("02:30:00").apply(report.reportTime) || Validator.contains("02:45:00").apply(report.reportTime) || Validator.contains("03:00:00").apply(report.reportTime) || Validator.contains("03:15:00").apply(report.reportTime) || Validator.contains("03:30:00").apply(report.reportTime) || Validator.contains("03:45:00").apply(report.reportTime) || Validator.contains("04:00:00").apply(report.reportTime) || Validator.contains("04:15:00").apply(report.reportTime) || Validator.contains("04:30:00").apply(report.reportTime) || Validator.contains("04:45:00").apply(report.reportTime) || Validator.contains("05:00:00").apply(report.reportTime) || Validator.contains("05:15:00").apply(report.reportTime) || Validator.contains("05:30:00").apply(report.reportTime) || Validator.contains("05:45:00").apply(report.reportTime) {

                    // do something which I don't know

                }

【问题讨论】:

  • 您是在问如何计算开始时间 (queryStarting) 和结束时间 (queryEnding) 之间的节点数 (snapshot.childrenCount) 吗?

标签: arrays swift list firebase arraylist


【解决方案1】:

在模型Report中创建一个枚举TimeOfTheDay,并根据小时值初始化该枚举。并在模型中创建TimeOfTheDay 类型的计算属性。

struct Report {
    enum TimeOfTheDay {
        case morning, noon, evening, night
        init?(_ hour: Int) {
            switch hour {
            case 0...6:
                self = .night
            case 6...12:
                self = .morning
            case 12...18:
                self = .noon
            case 18...24:
                self = .evening
            default:
                return nil
            }
        }
    }
    var id: String
    var reportTime: String
    //...other properties    
    var timeOfTheDay: TimeOfTheDay? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
        if let date = dateFormatter.date(from: reportTime) {
            let hour = Calendar.current.component(.hour, from: date)
            return TimeOfTheDay(hour)
        }
        return nil
    }
}

选项 1

现在使用Dictionary(grouping:by:) 方法,您可以根据一天中的时间值对reports 数组进行分组。

var allReports = [Report(id: "a", reportTime: "2019-07-27 01:30:00 +0000"), Report(id: "a", reportTime: "2019-07-27 20:30:00 +0000"),
                  Report(id: "a", reportTime: "2019-07-27 11:30:00 +0000"), Report(id: "a", reportTime: "2019-07-27 03:30:00 +0000"),
                  Report(id: "a", reportTime: "2019-07-27 09:30:00 +0000"), Report(id: "a", reportTime: "2019-07-27 10:30:00 +0000"),
                  Report(id: "a", reportTime: "2019-07-27 15:30:00 +0000"), Report(id: "a", reportTime: "2019-07-27 07:30:00 +0000")]
var groupedReports = Dictionary(grouping: allReports) { $0.timeOfTheDay }
print(groupedReports)
//[night: [Report(id: "a", reportTime: "2019-07-27 20:30:00 +0000")],
// morning: [Report(id: "a", reportTime: "2019-07-27 01:30:00 +0000"), Report(id: "a", reportTime: "2019-07-27 03:30:00 +0000")],
// noon: [Report(id: "a", reportTime: "2019-07-27 11:30:00 +0000"), Report(id: "a", reportTime: "2019-07-27 09:30:00 +0000"),
//        Report(id: "a", reportTime: "2019-07-27 10:30:00 +0000"), Report(id: "a", reportTime: "2019-07-27 07:30:00 +0000")],
// evening: [Report(id: "a", reportTime: "2019-07-27 15:30:00 +0000")]]

您可以从字典中获取仅早上的报告

print(groupedReports[Report.TimeOfTheDay.morning])
//[Report(id: "a", reportTime: "2019-07-27 01:30:00 +0000"),Report(id: "a", reportTime: "2019-07-27 03:30:00 +0000")]

选项 2

使用filter(_:) 方法获取仅早上的报告

let morningReports = allReports.filter { $0.timeOfTheDay == Report.TimeOfTheDay.morning }
print(morningReports)
//[Report(id: "a", reportTime: "2019-07-27 01:30:00 +0000"), Report(id: "a", reportTime: "2019-07-27 03:30:00 +0000")]

【讨论】:

    猜你喜欢
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多