2016-09-27 9 views
0

Objective-Cでは、ディスパッチソースのイベントハンドラをブロックまたは関数として指定できます。 AppleのConcurrency Programming Guideから:Swift 3のDispatchSourceのGCD関数イベントハンドラ?

機能ベースのイベントハンドラは、シングルコンテキスト・ポインタを取る は、ディスパッチソースオブジェクトを含む、そして何も値を返しません。 ブロックベースのイベントハンドラはパラメータを取らず、戻り値は です。

スウィフト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 = {source in print(" hi \(source) ")}'そして、 'source.setEventHandler {foo(source)}'のようなこともできますか?言い換えれば、なぜ 'class Foo'が必要ですか? – sam

+0

クラスは必要ありません。それがなぜあなたがソースから離れて定義される必要があるのか​​という私の最初の考えでした。キャプチャを回避するには、ソースへの弱参照を使用するイベントハンドラにキャプチャリストを追加します。 –

関連する問題