Как поделиться состоянием объекта в разных экземплярах? - PullRequest
0 голосов
/ 02 апреля 2019

Привет , я пытаюсь улучшить свои навыки развития и столкнулся с некоторыми трудностями.Я читал о Observers в Swift на SwiftBySundell.com и теперь хочу улучшить приложение, над которым я сейчас работаю.

Приложение простое: вы нажимаете кнопку, и отметка времени сохраняется в базе данных CoreData.

Итак, я получил вид с кнопкой и моделью с некоторыми функциями.На мой взгляд, при нажатии кнопки состояние моей модели (TimeMachine) должно изменяться, скажем, с .idle на .started.

Ниже я добавил некоторый код о том, как я могу достичь этих двух наблюдателей.

Теперь, в то время как Сунделл объясняет, что мне нужно сделать, чтобы реализовать Observers (примерно 4 различными способами), мне, кажется, не хватает некоторого понимания того, что на самом деле происходит.

Особенно, когда я хочусоздайте новый вид, который также создаст экземпляр TimeMachine.(Разве это не способ сделать это? Должен ли я передать объект в представление вместо создания нового?)

Подводя итог моему вопросу: Как лучше всего получить aобщее состояние моего TimeMachine через мои взгляды?И даже при наличии наблюдателей, они работают только над одним и тем же экземпляром класса?

Редактировать: Я знаю, что такое объект и что два экземпляра различны.Однако будет ли возможность создать статическую переменную, например?Я просто пытаюсь выяснить, как правильно поступить.

Действительно ли я должен пройти по ТМ, каждый раз, когда переходу к следующему виду?

import Foundation

class TimeMachine {
    var state = State.idle {
        didSet { stateDidChange() }
    }

    func stateDidChange() {
        print("The State is now \(state)")
    }

    enum State{
        case idle
        case started
        case paused
    }
}

let tM = TimeMachine()
let tM2 = TimeMachine()

tM.state = .idle
//The State is now idle
tM.state = .started
//The State is now started

print("tM2 State is: \(tM2.state)")
//tM2 State is: idle

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

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

Поскольку классы являются ссылочными типами, вы можете передавать ссылки на один и тот же экземпляр вашего TimeMachine через ваши представления.Вы можете использовать методы, замыкания, переменные, ...

Итак, вам нужен тот же экземпляр

let tM = TimeMachine()
tM.state = .started // prints "The State is now \(state)"
0 голосов
/ 02 апреля 2019

Если я правильно вас понимаю, вы хотите знать, как "правильно" поделиться состоянием в вашем приложении, в данном случае в вашем экземпляре TimeMachine? Есть много способов сделать это, вот несколько способов.

Использование инъекции зависимостей:

  • Передать объект на навигацию
  • Используйте библиотеку внедрения зависимостей или напишите свою собственную.

Создание правильного экземпляра TimeMachine из доступных данных. (Я не думаю, что это возможно в этом случае использования).

Используйте синглтон, расширяющий TimeMachine для хранения статической общей переменной.

class TimeMachine {
    static let TimeMachine shared = TimeMachine()

    var state = State.idle {
        didSet { stateDidChange() }
    }

    func stateDidChange() {
        print("The State is now \(state)")
    }

    enum State{
        case idle
        case started
        case paused
    }
}

ИМХО, вам просто нужно передать ссылку на объект TimeMachine в этом случае. Кроме того, я не думаю, что шаблон Observer действительно применим в этом вопросе, если только я не понимаю его часть.

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