2016-09-27 3 views
0

В Objective-C вы можете указать обработчик событий для источника отправки как блока или функции. От компании Apple Concurrency Programming Guide:Обработчик события функции GCD для DispatchSource в Swift 3?

функции-обработчики событий принимают один указатель на контекст, содержащий объект источника отправки, и не возвращают никакого значения. Обработчики событий на основе блоков не принимают параметров и не имеют значения .

В Swift 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 = {источник в печати (" hi \ (source) ")}', а затем 'source.setEventHandler {foo (source)}'? Другими словами, зачем вам «класс Foo»? – sam

+0

Вам не нужен класс. Это была моя первая мысль о том, почему вы нуждались в ней, определенную от источника. Чтобы предотвратить захват, вы можете добавить список захвата в обработчик событий, который использует слабую ссылку на источник. –

 Смежные вопросы

  • Нет связанных вопросов^_^