Проверьте основные данные для записи с сегодняшней датой и выполняйте функцию - PullRequest
0 голосов
/ 29 декабря 2018

Я довольно новичок в Swift и надеюсь, что кто-то знает ответ на этот вопрос - кажется, ничего из того, что я пытаюсь сделать, не работает!

У меня есть приложение Swift, в котором есть элемент Core Data под названием «Напиток» с 2 ключами:Дата, а затем - «drinkWater», которая сохраняет значение «1» при нажатии кнопки.

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

Я понимаю, что нижеприведенный ответ не является ответом, но насколько я понял!По сути, я могу получить все записи, основываясь на значении drinkWater (это должно быть по дате, которую я предполагаю?), И я могу получить сегодняшнюю дату, выводящую все данные на консоль.Теперь я застрял ...

private func updateMyImageView() {

    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    let context = appDelegate.persistentContainer.viewContext

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Drink")
    request.predicate = NSPredicate(format: "drinkWater = %@", "1")
    request.returnsObjectsAsFaults = false

    do {
        let result = try context.fetch(request)
        for data in result as! [NSManagedObject] {
            print(data.value(forKey: "timestamp") as! Date)

        }

    } catch {

        print("Failed")
    }

    let dateNow = Date()

    print("Date is \(dateNow)")

}

Это возвращает:

2018-12-29 01:27:27 + 0000

Дата 2018-12-29 12:21:21 + 0000

Буду очень признателен за любые идеи о том, как превратить все это в правильную функцию !!

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Спасибо за вашу помощь.У меня все это работает сейчас.Мой окончательный код:

let appDelegate = UIApplication.shared.delegate as! AppDelegate

        let context = appDelegate.persistentContainer.viewContext

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

        let dateFrom = calendar.startOfDay(for: Date())
        let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)

        let fromPredicate = NSPredicate(format: "timestamp >= %@", dateFrom as NSDate)
        let toPredicate = NSPredicate(format: "timestamp < %@", dateTo! as NSDate)
        let waterPredicate = NSPredicate(format: "drinkWater = %@", "1")

        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Drink")
        request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [waterPredicate, fromPredicate, toPredicate])

        do {
            let result = try context.fetch(request)
            for data in result as! [NSManagedObject] {
                print(data.value(forKey: "timestamp") as! Date)

              drinkMoreButton.setBackgroundImage(UIImage(named: "watericonselected.png"), for: UIControlState.normal)
            }

        } catch {

            print("Failed")
        }
0 голосов
/ 29 декабря 2018

Вам нужно использовать диапазон дат от начала дня до конца дня (от полуночи до полуночи) в составном предикате.Вот решение, основанное на похожем вопросе SO

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

let dateFrom = calendar.startOfDay(for: Date())
let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)

let fromPredicate = NSPredicate(format: "timestamp >= %@", dateFrom as NSDate)
let toPredicate = NSPredicate(format: "timestamp < %@", dateTo! as NSDate)
let waterPredicate = NSPredicate(format: "drinkWater = %@", "1")

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Drink")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [waterPredicate, fromPredicate, toPredicate])
...