提问人:Yuuu 提问时间:12/7/2021 最后编辑:WillekeYuuu 更新时间:12/7/2021 访问量:217
前面有@objc的功能和功能没有@objc的区别
difference between function with @objc in front and function doesn't have @objc
问:
在我项目中的一个视图控制器文件中,有两个函数,一个在 viewdidload 中调用,另一个由 Notification 和 observers 调用。这些函数的作用完全相同,我想知道我是否删除了其中一个函数,尤其是前面没有使用@objc的函数。(否则我得到一个错误)
override func viewDidLoad() {
super.viewDidLoad()
configureNotifications()
displayItems()
}
func displayItems() {
fetchLiveEvents { [weak self] in
self?.applySnapshot(animatingDifferences: true)
}
}
func configureNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(updateExistingItem), name: .updateExistingItem, object: nil)
}
@objc func updateExistingItem() {
fetchLiveEvents { [weak self] in
self.applySnapshot(animatingDifferences: true)
}
}
由于我使用的是通知慢跑,因此我无法摆脱 updateExistingItem 函数前面的@objc。但是,updateExistingItem 和 displayItems 正在做一些事情,所以我觉得这有点多余,我正在考虑从 viewDidLoad 中删除 displayItems 函数并调用 updateExistingItem(可能会更改名称)在 viewdidLoad 中代替。
Swift 编程中是否有任何约定,当它们做同样的事情时,它们会同时保持@objc和正常功能?还是只是个人喜好,离开他们俩都没关系?
答:
1赞
Zeeshan Ahmad II
12/7/2021
#1
viewDidLoad 在屏幕存在时只调用一次,如果您通过推送视图控制器或呈现控制器转到另一个屏幕并返回到该控制器,则 viewDidLoad 未触发,它永远不会再次调用,直到下次运行/终止应用程序并再次打开。
因此,当此屏幕出现时,通知会调用您的函数以再次运行。
// just called once
override func viewDidLoad() {
super.viewDidLoad()
configureNotifications()
displayItems()
}
// just called every time when you popped a viewController or tap on tab bar items using tabbar controller
override func viewWillAppear() {
super.viewDidLoad()
displayItems()
}
在您的场景中,您可能通过显示其他屏幕并在那里执行一些功能并调用通知在此屏幕上触发,因此,如果您通过模式演示样式在全屏上呈现屏幕,则不会触发任何内容 这就是调用通知以再次开始显示项目的原因
override func viewDidLoad() {
super.viewDidLoad()
configureNotifications()
displayItems()
}
// called once
func displayItems() {
fetchLiveEvents { [weak self] in
self?.applySnapshot(animatingDifferences: true)
}
}
func configureNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(updateExistingItem), name: .updateExistingItem, object: nil)
}
// called every time when you trigger notifcation
@objc func updateExistingItem() {
fetchLiveEvents { [weak self] in
self.applySnapshot(animatingDifferences: true)
}
}
评论
@objc
#selector
@objc func updateExistingItem
#selector
displayItems
viewdidload
updateExistingItem()
viewdidload
@objc
func displayItems
@objc func updateExistingItem
@objc
#selector
@objc