【问题标题】:How to pass a Notification to the method called by the Observer in Swift 3如何将通知传递给 Swift 3 中观察者调用的方法
【发布时间】:2016-12-14 16:27:43
【问题描述】:

我想访问通过以下方法发送的 Notification 对象。

var currentTrack:MPMediaItem? {
    get{
        return playlist?.items[index]
    }
    set{
        print(newValue?.title!)
        //self.index = locateIndex(track: newValue!)
        let notif = Notification.init(name: Playlist.SongChangedName, object:self)
        NotificationCenter.default.post(notif)
    }
}

通知名称定义为:

static let SongChangedName = Notification.Name("SongChangedNotification")

这里是观察者:

override init() {
    super.init()
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(testSelector),
                                           name: Playlist.SongChangedName, //Notification.Name("songChanged"),
                                           object: nil)
}

这是它调用的方法:

func testSelector(notification:Notification){

    queueNextTrack()

}

如何通过 testSelector 通知对象?我知道这与 addObserver 方法的对象参数有关。

谢谢。

【问题讨论】:

  • 通知中会传递给notification.object中的选择器
  • 对。我如何将该通知传递给选择器? addObserver 方法中通知的引用在哪里?
  • 它已经被传入你的选择器,你不需要对addObserver方法做任何其他事情
  • 丹,你似乎是对的。我想我需要了解一些关于“选择器”的东西。不同的是 testSelector(notification:Notification) 无需我直接传递通知即可工作。

标签: ios swift observer-pattern


【解决方案1】:

您现在可以通过不在通知、计时器等中使用选择器来完全摆脱您的问题。有新的基于块的 API 来替换目标选择器,例如

NotificationCenter.default.addObserver(forName: Playlist.SongChangedName, object: nil, queue: nil, using: { notification in
    self.testSelector(testSelector)
})

在大多数情况下,您不需要访问块中的通知,因此您也可以这样做

func testSelector(){
    queueNextTrack()
}

NotificationCenter.default.addObserver(forName: Playlist.SongChangedName, object: nil, queue: nil) { _ in
    self.testSelector()
}

或大多数情况下我最喜欢的:

override init() {
    super.init()
    let testBlock: (Notification) -> Void = {
        self.queueNextTrack()
    }
    NotificationCenter.default.addObserver(forName: Playlist.SongChangedName, object: nil, queue: nil, using: testBlock)
}

编辑我还建议您查看此 API 说明中的示例代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多