Как мне написать быструю функцию, которая будет считать количество дней без записи? - PullRequest
0 голосов
/ 10 сентября 2018

Я работаю над проектом с NSManagedObjects, где каждый объект является пользовательской записью, которая имеет значение и дату. Приложение будет работать в среднем за 7 дней и за 14 дней из значений, которые вводит пользователь. Я уже настроил его для выполнения соответствующих запросов на выборку, суммирования значений и деления на 7 и 14 соответственно. Однако я понимаю, что когда пользователь впервые начнет использовать приложение, эти средние значения будут вводить в заблуждение, поэтому я хотел бы настроить функцию, которая будет оценивать количество дней из последних 7 и 14, которые не имеют любые записи, чтобы я мог вычесть это значение из знаменателя в этих расчетах. Я относительный новичок, и мне трудно понять, как написать эту функцию, поэтому любая помощь будет принята с благодарностью. Заранее спасибо.

Редактировать в ответ на Дрекку:

Код, с которого я работаю, ниже. Я прошу прощения за широкий вопрос, но я не могу понять, с чего начать структурирование циклической функции для того, что я пытаюсь сделать, и я не смог найти какие-либо примеры или аналоги в поиске Я сделал. В основном я извлекаю все значения, введенные за последние семь дней, но я пытаюсь найти способ оценки для дней, когда значения не были введены в пределах диапазона этого запроса на выборку.

func sevenDayFetch() {
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

    let managedContext = appDelegate.persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Entry")

    var calendar = Calendar.current
    calendar.timeZone = NSTimeZone.local

    let sevenDaysAgo = calendar.date(byAdding: .day, value: -7, to: Date())
    let dateFrom = calendar.startOfDay(for: sevenDaysAgo!)
    let dateTo = Date()

    let fromPredicate = NSPredicate(format: "entryDate > %@", dateFrom as NSDate)
    let toPredicate = NSPredicate(format: "entryDate <= %@", dateTo as NSDate)
    let sevenDayPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [fromPredicate, toPredicate])
    fetchRequest.predicate = sevenDayPredicate

    do {
        entryArray = try managedContext.fetch(fetchRequest)
        var sevenDayArray: [Int] = []
        for i in entryArray as [NSManagedObject] {
            sevenDayArray.append(i.value(forKey: "Value") as! Int)
        }
        let sevenDaySum = sevenDayArray.reduce(0, +)
        let sevenDayAverage = sevenDaySum/7

        sevenDayAverageLabel.text = String(sevenDayAverage)

1 Ответ

0 голосов
/ 16 сентября 2018

Я считаю полезным сохранить дату установки приложения в UserDefaults.

 func installDate() -> NSDate {
    var installDate: Date
    if let date = UserDefaults.standard.object(forKey: UserDefaultsKeys.dateInstalled) as? Date {
        installDate = date
    } else {
        installDate = Date()
        UserDefaults.standard.set(installDate, forKey: UserDefaultsKeys.dateInstalled)
    }
    return installDate
}

Базовые данные плохо подходят для хранения одного глобального значения. И вы не можете определить дату установки из основных данных; отсутствие значения даты не означает, что он не был установлен.

Как только вы знаете дату установки, вы можете настроить расчеты и свой пользовательский интерфейс, если он меньше 14 или 7 дней.

...