具有许多 UIView 的单例服务
Singleton service with many UIViews
学习 swift 并且只遇到一个问题。我正在尝试将委托与 singleton
服务一起使用。
使用委托我想更新多个视图,但由于 singleton
实现委托保留最后一个 UIView。
因此,例如,我有 3 个 UIView,ID 分别为 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
}
}
我的服务
class AudioService {
static let shared = AudioService()
var delegate: AudioServiceDelegate?
var identifier: String?
...
@objc func didUpdate(_ notification: Notification) {
self.delegate?.myServiceDidUpdate(self.identifier)
}
}
您可以保留一个 uid 数组,但多观察者的最佳做法是
// 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")
}
Delegate is used for 1-1 observing while notificationCenter is used for 1-m
学习 swift 并且只遇到一个问题。我正在尝试将委托与 singleton
服务一起使用。
使用委托我想更新多个视图,但由于 singleton
实现委托保留最后一个 UIView。
因此,例如,我有 3 个 UIView,ID 分别为 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
}
}
我的服务
class AudioService {
static let shared = AudioService()
var delegate: AudioServiceDelegate?
var identifier: String?
...
@objc func didUpdate(_ notification: Notification) {
self.delegate?.myServiceDidUpdate(self.identifier)
}
}
您可以保留一个 uid 数组,但多观察者的最佳做法是
// 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")
}
Delegate is used for 1-1 observing while notificationCenter is used for 1-m