2016-09-27 38 views
0

在Objective-C中,您可以將調度源的事件處理程序指定爲塊或函數。從蘋果公司的Concurrency Programming GuideSwift 3中DispatchSource的GCD函數事件處理程序?

基於函數的事件處理程序採取單一的上下文指針, 含派遣源對象,並沒有返回值。 基於塊的事件處理程序不採用參數,並且沒有返回 值。

在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 = {print in print(「hi \(source)」)}'然後是'source.setEventHandler {foo(source)}'?換句話說,你爲什麼需要'Foo'類? – sam

+0

你不需要這個班。那是我首先想到的,爲什麼你需要將它定義爲遠離源代碼。爲了防止捕獲,您可以將捕獲列表添加到使用弱引用來源的事件處理程序。 –