ios - 如何将通知传递给 Swift 3 中观察者调用的方法

标签 ios swift observer-pattern

我想访问从下面的方法发送的通知对象。

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 方法的对象参数有关。

谢谢。

最佳答案

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

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

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

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 描述中的示例代码

关于ios - 如何将通知传递给 Swift 3 中观察者调用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38836952/

相关文章:

ios - DateFormatter 返回错误的时间

javascript - 动态更改视频标签源时移动 Safari 崩溃

swift 在一行中使用 guard 和类型检查

ios - 类继承、重写方法以及访问父类(super class)存储的属性

objective-c - 具有(复杂)关系和核心数据/RAILS 的 Restkit

ios - 我的 UITapGestureRecognizer 不工作

java - Java中的可观察模式实现

c++ - 继承和模板,一种奇怪的行为

design-patterns - 观察者设计模式的故事是什么?

ios - 自定义 UITableViewCells 和 UITableView 的问题