onReceive вызывается бесконечно в swiftUI - PullRequest
0 голосов
/ 21 марта 2020

Я получаю бесконечное значение l oop, onReceive вызывается бесконечно при использовании протокола с переменной @Published. Чтобы использовать переменную @Published в протоколе, я использую этот ответ stackoverflow . Эта строка в MyImageView:

if self.viewModel.answered {

, кажется, вызывает вызов в

onReceive { self.viewModel.objectWillChange

внутри ContentView.

Есть идеи, как заставить это работать?

Это весь код:

EnvObject:

import UIKit
import SwiftUI
import Combine
import Foundation

protocol MyProtocol: AnyObject {
    var answered: Bool { get set }
    var answeredPublished: Published<Bool> { get }
    var answeredPublisher: Published<Bool>.Publisher { get }
}

class GameViewModel: ObservableObject & MyProtocol {

    @Published var answered = false
    var answeredPublished: Published<Bool> { _answered }
    var answeredPublisher: Published<Bool>.Publisher { $answered }

}

Просмотры:

import SwiftUI

struct MyImageView: View {
    @EnvironmentObject var viewModel: GameViewModel

    var body: some View {
        if self.viewModel.answered {
            print("not nil")
            return AnyView(Image("clearImage")
                .resizable()
                .scaledToFit()
            )
        }
        else {
            print("nil")
            return AnyView(
                Text(self.viewModel.answered ? "true" : "false")
            )
        }
    }
}

struct ViewBelow<ViewModel: ObservableObject & MyProtocol>: View {
    @EnvironmentObject var viewModel: ViewModel

    var body: some View {
        Text("below")
        .onReceive(self.viewModel.objectWillChange,

           perform: { _ in
               print("onReceive target")
           }
        )
    }
}


struct ContentView: View {
    @EnvironmentObject var viewModel: GameViewModel
    var body: some View {
        GeometryReader {
            geo in
            VStack {
                MyImageView()

                ViewBelow<GameViewModel>()
            }
        }
    }
}

SceneDelegate import UIKit import SwiftUI

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        let contentView = ContentView().environmentObject(GameViewModel())

        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }
}

1 Ответ

0 голосов
/ 22 марта 2020

Это сработало для меня:

class MyPublishedProperties {
    @Published var answered = false
}

protocol MyProtocol: MyPublishedProperties {
    func changePublishedPropertyValue(newValue: Bool)
}


class GameViewModel: ObservableObject & MyPublishedProperties, MyProtocol {

    func changePublishedPropertyValue(newValue: Bool) {
        answered = newValue
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...