onReceive не срабатывает в некоторых случаях - PullRequest
1 голос
/ 26 мая 2020

Ниже мой рабочий код:

struct ReaderView: View {
    @State var presentingSettingsSheet = false
    @State var currentDate = Date()

private let timer = Timer.publish(every: 1.0, on: .main, in: .common)
    .autoconnect()
    .eraseToAnyPublisher()

var body: some View {
    let filter = "Showing all stories"

    return NavigationView {
        List {
            Section(header: Text(filter).padding(.leading, -10)) {
                VStack(alignment: .leading, spacing: 10) {
                    TimeBadge(time: 20.0)

                    Text("Title")
                        .frame(minHeight: 0, maxHeight: 100)
                        .font(.title)

                    PostedBy(time: 30.0, user: "Author", currentDate: self.currentDate)
                    }
                .padding()
            }
        }
        .sheet(isPresented: self.$presentingSettingsSheet, content: {
            SettingsView()
        })
        .navigationBarTitle(Text("Stories"))
        .navigationBarItems(trailing:
            Button("Settings") {
                self.presentingSettingsSheet = true

            }
        )
    }
    .onReceive(timer) {
        print($0)
        self.currentDate = $0
    }
}}

Но если я добавлю onReceive после List Scope, он не работает, он начнет работать, если я добавлю его после объявления navigationBarItems. Итак, мой вопрос в том, почему onReceive ведет себя по-другому, если поместить его в код по-другому. Я знаю, что последовательность модификаторов изменяет конечный результат UI, но это то же самое для onReceive. Я ищу возможное объяснение этому.

Я использую: Симулятор Xcode 11.5 iPhone SE (2-е поколение), 13.5.

1 Ответ

0 голосов
/ 26 мая 2020

это НЕ решение и не объяснение, просто дополнительный комментарий:

если вы увеличите свой таймер до

private let timer = Timer.publish(every: 1.0, on: .main, in: .common)
        .autoconnect()
        .print()
        .eraseToAnyPublisher()

, вы получите

receive subscription: (Timer)
request unlimited
request unlimited
receive cancel
receive subscription: (Timer)
request unlimited
request unlimited

если вы поставите onReceive в список во всех других местах (например, в тексте или навигации), вы получите только

receive subscription: (Timer)
request unlimited
request unlimited

, поэтому я думаю, что каким-то образом в списке издатель будет отменен и запущен снова, что может быть причиной «не работает»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...