2017-12-05 17 views
0

알림 관찰자를 추가 할 때 #selector 과제물에 어떤 문제가 있습니까?옵티 날 클로저가있는 스위프트 셀렉터 기능

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

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

    completionHandler?(true) 
} 

나는 이미 같은 것들을 시도

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

notifiction를 게시 할 때마다 응용 프로그램 충돌을 #selector(reloadData(completionHandler: nil)

편집 : 나는 선택 #selector(reloadData(completionHandler:))을 시도하지만 여전히와 충돌 알림을 게시하는 행의 오류 메시지 Thread 1: EXC_BAD_ACCESS (code=1, address=0x8).

모든 것이 잘 작동하지만, 그냥 전화를

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


func testCall() { 
    self.reloadData() 
} 
+1

'#selector (reloadData (completionHandler :))' –

+0

완전하고 정확한 오류 메시지로 질문을 업데이트하거나 (의견을 게시하지 마십시오) 문제를 일으키는 정확한 행을 지적하십시오. – rmaddy

+1

선택자에 대한 유일한 유효한 인수는'Notification'입니다. 다른 매개 변수를 사용하는 선택기를 전달할 수 없습니다. – rmaddy

답변

0

알림 선택 방법에 완료 핸들러가 무의미한 (불법) 또 다른 기능을하는 함수를 만들 정말 좋은하지 않습니다 나는 다음과 같이 코드를 변경하는 경우 . 완성 처리기의 수신자가 될 것으로 예상되는 대상은 무엇입니까?

통지 선택자의 구문은 대상/조치 선택자와 매우 유사합니다. 전달 된 매개 변수는 영향을받는 개체의 유형이어야합니다 (여기 Notification).

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

대안 둘러싸 기능/방법의 값을 포착 할 수있다 Notification 블록 기반 API이다.

지정된 선택자가있는 알림 개체에서 사용자 지정 데이터를 전달하는 유일한 방법은 (선택 사항) userInfo 사전입니다.

+0

사실 저는 selector에있는 my function에'completionHandler'를 전달하고 싶지 않습니다. 하지만 코드의 다른 부분에서 함수에'completionHandler'를 전달해야합니다. 이것이'completionHandler'가 선택적인 이유입니다. 난 그냥 내 선택기 메서드입니다 추가 기능을 만들 수 있습니다. 그리고이 함수는'completionHandler'가 없기 때문에'reloadData'를 호출하지 않고 (completionHandler'가 옵션이므로 가능합니다) 아무것도하지 않을 것입니다. 그건 내 질문에 편집 한 것과 거의 같다. – jeanggi90

+0

'userInfo' 딕셔너리도 클로저 (완료 핸들러)를 취할 수 있으며 기본적으로 선택 사항입니다 – vadian