'Swift selector function with optional closure?

What am I doing wrong with the #selector assignment when I add the notification observer?

NotificationCenter.default.addObserver(self, selector: #selector(reloadData), name: NSNotification.Name(rawValue: "reloadCollectionData"), object: nil)

func reloadData(completionHandler: ((Bool) -> Void)? = nil ) {
    mainCollectionView.reloadData()
    
    completionHandler?(true)
}

The app crashes whenever I post the notification:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "reloadCollectionData"), object: nil)

I have already tried things like #selector(reloadData(completionHandler: nil)

EDIT: I have tried the selector #selector(reloadData(completionHandler:)) but it still crashes n the line where I post a notification, with the error message:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x8)

When I change the code as follows everything works fine but it is not really nice to create a function just to call another function

NotificationCenter.default.addObserver(self, selector: #selector(testCall), name: NSNotification.Name(rawValue: "reloadCollectionData"), object: nil)
 

func testCall() {
    self.reloadData()
}


Solution 1:[1]

A completion handler in a notification selector method is nonsensical (and illegal). What do you expect is the object which is supposed to be the receiver of the completion handler ... ?

The syntax of a notification selector is very similar to a target/action selector. The passed parameter must be the type of the affected object (here Notification).

func reloadData(_ notification : Notification) { ...

The alternative is the block based API of Notification which is able to capture values of the enclosing function / method.

The only way to pass custom data in a notification object with specified selector is the (optional) userInfo dictionary.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 vadian