Синглтон сервис со многими UIViews - PullRequest
0 голосов
/ 29 ноября 2018

Учимся быстро и просто застряли с одной проблемой.Я пытаюсь использовать делегатов с сервисом singleton.
С делегатом я хочу обновить несколько представлений, но из-за singleton делегат реализации сохраняет последний UIView.
Так, например, у меня есть 3 UIViews с идентификаторами 1, 2, 3. Когда я сделаю в init body self.myservice.delegate = self и попытаюсь использовать конкретный метод делегата ex.myServiceDidUpdate затем в этом методе делегата обращаются к self.viewId, всегда возвращая last id.
Я полагаю, это связано с реализацией сервиса singleton и хотел попросить вас о помощи.

Примечание : мне нужна одноэлементная реализация для поддержания конкретной переменной в обслуживании

Вопрос :Можно ли сохранить 3 экземпляра моего сервиса, а также сохранить переменные в том сервисе, который мне нужен?Или как лучше всего справиться с этим

Код

class SimpleView: UIView, AudioServiceDelegate {
    private var audioService = AudioService.shared
    var viewId: String?
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.viewId = NSUUID().uuidString
        self.audioService.delegate = self
    }

    func myServiceDidUpdate(identifier: String?) { <-- identifier coming from service i need to keep it across multiple views
        print("SELF", self.viewId) <-- Keeps always last initialized ID
    }
}

MyService

class AudioService {
    static let shared = AudioService()
    var delegate: AudioServiceDelegate?
    var identifier: String?

    ...

    @objc func didUpdate(_ notification: Notification) {
        self.delegate?.myServiceDidUpdate(self.identifier)
    }
}

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете сохранить массив uids, но лучший метод для нескольких наблюдателей:

// add observer wherever you want to register for new data
notificationCenter.addObserver(self,
                           selector: #selector(self.calledMeth),
                           name: .didReceiveData,
                           object: nil)

//

// post when you want to publish data
NotificationCenter.default.postNotification(name: .didReceiveData, object: nil)

extension Notification.Name {
  static let didReceiveData = Notification.Name("didReceiveData")
  static let didCompleteTask = Notification.Name("didCompleteTask")
}

Делегатиспользуется для наблюдения 1-1, в то время как центр уведомления используется для 1-м

...