2015-03-31 72 views
1

我有inits對象的方法,它有一個完成的塊:typedef void(^initCompletionHandler)(BOOL succesful);方法,其使用完畢塊,並返回一個對象

在這個方法中我要調用的處理程序,但我不知道該怎麼辦呢因爲如果我在返回之前調用它,對象將不會完成初始化,這將在下一行中立即使用。我顯然不能在返回後調用處理程序。我,電子:

if(haveError){ 
      handler(NO); 
     } 
     else{ 

      handler(YES); 
     } 
     return self; 

有什麼辦法可以返回並在同一時間調用處理程序?

+0

我建議你創建一個類工廠的方法,並使用它而不是alloc/init – Paulw11 2015-03-31 11:08:56

+0

@ Paulw11我建議即使你實現了工廠方法,你可能不想啓動這個過程,導致完成'處理程序「被調用。 – Rob 2015-03-31 11:56:01

+1

是的,我真的不是OPs方法的粉絲 - 處理程序應該從初始化後在對象上調用的方法調用。 – Paulw11 2015-03-31 11:58:06

回答

1

一對夫婦的意見:「因爲......返回的對象不會被初始化完成」

  1. 我不清楚爲什麼你說您正在進行初始化,因此請確保它在調用handler之前完成所有相關的初始化。如果問題在於調用者還沒有對該對象的有效引用,那麼你總是可以在該塊的參數中包含對它的引用,例如,

    typedef void(^initCompletionHandler)(MyObject object, BOOL succesful); 
    

    ,然後提供該參數,例如:

    if (haveError){ 
        handler(self, NO); 
    } else { 
        handler(self, YES); 
    } 
    
  2. 另外,你說「我顯然不能調用處理程序返回之後」。但是你可以。你可以只是做一個dispatch_async,如果你想:

    dispatch_async(dispatch_get_main_queue(), ^{ 
        if (haveError){ 
         handler(NO); 
        } else { 
         handler(YES); 
        } 
    }); 
    return self; 
    

    這是一個有點不雅,因爲如果你從另一個線程調用它,您有可能需要協調/同步一些潛在的競爭條件,但你這個想法:你不必同時調用handler

在作出這兩個意見,我必須承認,我沒有init實際上發起一些異步工段,並具有其自身完成塊的粉絲。我傾向於做出這兩個不同的步驟。如果你看看Cocoa API,蘋果公司已經基本上從這種模式中轉移出來,通常有一種實例化的方法,另一種是啓動異步過程。

+0

你說得對,謝謝你的評論。將某個完成塊放在需要返回對象的東西中確實沒有什麼意義。我將異步進程從init方法移出到它自己的獨立進程中。現在工作很好,而且更清晰。 – Kex 2015-03-31 12:20:09