Как добавить совместимость совместимости с пользовательскими классами с поддержкой старых iOS? - PullRequest
0 голосов
/ 04 октября 2019

Я создаю фреймворк и хочу поддержать ранних пользователей Combine и SwiftUI для некоторых из моих провайдеров, не отказываясь от поддержки предыдущих версий iOS. Мне нравится декларативный стиль, и я часто использую наблюдаемые классы / структуры для переменных состояний, которые могут быть использованы разработчиком. Как добавить поддержку Combine, не отказываясь от поддержки iOS10 + и не кодируя два разных класса?

Я планировал добавить расширение #if canImport(Combine) для таких классов, чтобы пользователи iOS13 могли использовать его родным способом, не создавая собственные хранилища. Например, они могли бы просто позвонить .sink или .assign и получать обновления.

Я не знаю, какой протокол принять. Я думал, что хранилище - это Publisher, но Publisher не может использовать метод .send, когда что-то меняется, и я не знаю, как уведомить Subscriber.

public class SomeDataProvider<T> {
    private var didChangeHandler: ((T?) -> Void)?

    public var value: T? {
        didSet {
            didChangeHandler?(value)
        }
    }
    public func didChange(handler: @escaping ((T?) -> Void)) {
        self.didChangeHandler = handler
    }

    public init() {}
}

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

1 Ответ

1 голос
/ 05 октября 2019

Это то, что этот репозиторий ( OpenCombine ) обрабатывает, у вас действительно прекрасная идея, но Combine слишком сложен для построения. Проект находится на ранней стадии разработки, потому что Combine является новым для мира.

...