2013-04-14 44 views
7

你什麼時候使用回調函數?我知道他們是如何工作的,我已經看到他們在使用,並且我多次使用他們。何時使用回撥功能?

來自C世界的一個例子是libcurl,它依靠回調進行數據檢索。

一種相反的例子是OpenSSL的:如果我已經用它,我用了參數:

ret = somefunc(&target_value); 
if(ret != 0) 
    //error case 

我想知道什麼時候使用?回調只對異步的東西有用嗎?我目前正在設計我的應用程序的API的過程中,我想知道是使用回調還是隻使用out參數。在底層,它將使用libcurl和OpenSSL作爲它構建的主庫,參數「returned」是一個OpenSSL數據類型。

我剛剛回來時看不到任何回調的好處。如果我想以任何方式處理數據而不是僅僅回收數據,這僅僅是有用的嗎?但是,我可以處理返回的數據。區別在哪裏?

回答

4

在最簡單的情況下,這兩種方法是等價的。但是如果可以多次調用回調來處理數據,那麼回調方法提供了更大的靈活性。

libcurl就是一個很好的例子:它提供了一個API,允許爲所有新到數據指定一個回調函數。另一種方法,如您所示,將返回數據。但回報它 - 如何?如果數據被追加到內存緩衝區中,它可能會變得非常大,並且調用者可能只想將其保存到文件中。如果數據保存到返回給調用者的文件中,則如果調用者實際上只想將其存儲在內存中,則可能會產生不必要的I/O。如果調用者只想計算校驗和,並且根本不需要存儲數據,那麼這兩種方法都是錯誤的。

回調方法允許調用者決定如何將基本數據塊組合成更大的整體。

0

如果該值可以立即返回,那麼是的,不需要回調。正如你猜測的那樣,回調是有用的,因爲無論什麼原因,值不能立即返回(可能它只是一個長時間運行的操作,它可以更好地異步執行)。

3

回調對於異步通知非常有用。當您使用某個API註冊回調函數時,您希望在發生某些事件時執行該回調函數。同樣,您可以將它們用作數據處理流水線中的中間步驟(如果您熟悉音頻/刻錄行業,則類似於「插入」)。

因此,要總結,這些是我所遇到的和/或實現的回調方案的兩個主要的範式:

  1. 我會告訴你,當數據到達或發生某些事件 - 你使用它,你覺得合適。
  2. 我會給你在處理它之前修改一些數據的機會。