2016-09-27 3 views
0

Objective-C에서 디스패치 소스에 대한 이벤트 처리기를 블록이나 함수로 지정할 수 있습니다.Swift 3의 DispatchSource 용 GCD 함수 이벤트 핸들러?

기능 기반의 이벤트 핸들러 파견 소스 개체를 포함하는 단일 컨텍스트 포인터, 을하고 값을 반환하지 : 애플의 Concurrency Programming Guide가에서. 블록 기반 이벤트 처리기는 매개 변수를 사용하지 않고 값을 반환하지 않습니다.

스위프트 3에서는 이벤트 처리기로 함수를 사용할 수 있습니까? 블록을 사용하는 방법 만 볼 수 있습니다. 내 처리기에서 소스에 액세스해야하며 소스가 정의 된 곳과 별도로 처리기를 정의해야합니다.

답변

1

어때?

class Foo { 
    var eventHandler: (DispatchSourceRead) -> Void 
    init(handler: @escaping (DispatchSourceRead) -> Void) { 
     eventHandler = handler 
    } 
} 

let foo = Foo() { source in 
    print("got event from source") 
} 

let source = DispatchSource.makeReadSource(fileDescriptor: 0) 
source.setEventHandler { 
    foo.eventHandler(source) 
} 
+0

블록 이벤트 핸들러를 사용하고 있지만 소스를 캡처하도록 작성 했습니까? 그게 맞습니까? 'let foo : (DispatchSourceRead) -> Void = {print in "hi \ (source)")}'그리고 나서'source.setEventHandler {foo (source)}'와 같은 일을 할 수 있었습니까? 다시 말해'클래스 푸 (class Foo) '가 필요한 이유는 무엇입니까? – sam

+0

수업이 필요하지 않습니다. 그것은 왜 당신이 원점에서 정의 된 것을 필요로하는지에 대한 나의 첫 번째 생각이었습니다. 캡처를 방지하려면 소스에 대한 약한 참조를 사용하는 캡처 핸들 목록에 이벤트 핸들러를 추가 할 수 있습니다. –