前面有@objc的功能和功能没有@objc的区别

difference between function with @objc in front and function doesn't have @objc

提问人:Yuuu 提问时间:12/7/2021 最后编辑:WillekeYuuu 更新时间:12/7/2021 访问量:217

问:

在我项目中的一个视图控制器文件中,有两个函数,一个在 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和正常功能?还是只是个人喜好,离开他们俩都没关系?

Swift Objective-C UIVieviceController NSEnformCenter 观察程序

评论

1赞 El Tomato 12/7/2021
当您使用 调用函数时,会使用 。@objc#selector
0赞 Yuuu 12/7/2021
是的,所以我必须使用 来调用函数。而不是调用 ,当我写进去时,它也可以工作。所以我想知道在不使用选择器的情况下调用函数是否可以。如果这不是理想的调用方式,我会在文件中使用 和。@objc func updateExistingItem#selectordisplayItemsviewdidloadupdateExistingItem()viewdidload@objcfunc displayItems@objc func updateExistingItem
1赞 Larme 12/7/2021
在函数之前添加(如果可能)没有问题。只是说使用桥接,一个 Objective-C 代码可以调用它。是“纯 Objective-C 代码”,或者是引擎盖下的代码(这是一个“遗留”的东西,因为 Swift 基于以前的 Objective-C API 和一些机制)。@objc#selector
0赞 Yuuu 12/8/2021
@Larme我明白了!!所以,我会在我的项目中保留那个。非常感谢!!@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)
        }
    }