Относительное время живого обновления в SwiftUI - PullRequest
0 голосов
/ 09 мая 2020

В моем приложении SwiftUI я показываю относительное время следующим образом.

struct ContentView: View {

    let date: Double = 1589014112

    var body: some View {
        Text(Date(timeIntervalSince1970: date).relativeTime())
    }
}

extension Date {
    func relativeTime(in locale: Locale = .current) -> String {
        let formatter = RelativeDateTimeFormatter()
        formatter.unitsStyle = .full
        return formatter.localizedString(for: self, relativeTo: Date())
    }
}

Я получаю временной интервал с 1970 года как double из API. Я хочу показывать относительное время в своем приложении. Результат выглядит следующим образом.

enter image description here

Представление обновляется только при перезагрузке и остается на «10 секунд a go» с каждой секундой. . Как обновить его в реальном времени? Я хочу изменить при изменении текущей даты (Date()).

1 Ответ

2 голосов
/ 09 мая 2020

Вы можете использовать TimerPublisher для периодического запуска чего-либо.
Вот краткий пример ниже;

struct PlaygroundView: View {

    let timer = Timer.publish(
        every: 1, // second
        on: .main,
        in: .common
    ).autoconnect()

    let date = Date()

    @State var secondStr: String = ""

    var body: some View {
        Text(secondStr)
            .onReceive(timer) { (_) in
                self.secondStr = self.date.relativeTime()
            }
    }
}

extension Date {
    func relativeTime(in locale: Locale = .current) -> String {
        let formatter = RelativeDateTimeFormatter()
        formatter.unitsStyle = .full
        return formatter.localizedString(for: self, relativeTo: Date())
    }
}

Вы можете заметить, что secondStr меняется каждую секунду, как
1 секунда a go
2 секунды a go
и так далее ..

...