2013-07-23 56 views
0

我花了相當多的時間閱讀塊,但由於某些原因,我很難完全理解它們。值得一提的是我是新手開發者,但是塊是我遇到的第一個真正的'塊',所以也許你可以幫助我。使用塊從不同類的回調

我有一個對象(ViewController的實例)正在與一個類交談(通過一個類方法 - 這是我設置爲請求/獲取數據的實用工具類)的情況。我想用塊實現一個回調方法。這裏是我目前對'我的代碼'的理解:

  • 一個塊可以作爲方法參數傳遞;
  • 塊可以像函數一樣調用。

好了,這裏是我的實用工具類我(簡化)方法:

+ (void)getDataWithCompletion:(void (^)(BOOL))completion { 

    //Some code... 
    completion(YES); 
} 

這是我如何調用該方法從我的viewController:

[ClassName getDataWithCompletion:^(BOOL gotData) { 

    if (gotData) { 
     NSLog(@"Called"); 
    } 
}]; 

當然,我是期待NSLog被打印在我的控制檯上,但唉...我知道我在這裏做錯了什麼,有人可以指出這一點嗎?任何菜鳥級的解釋將不勝感激。

+0

不要用'GET'前綴的方法......保留用於特殊情況下的方法,通過引用返回多個項目。還要注意,如果你的方法是異步執行的,你需要複製這個塊來保持它直到完成。 – bbum

+0

感謝您使用'get'來啓動方法名稱的建議,我將不得不通過我的代碼並在幾個地方進行更改。是'取'一個安全的詞使用? – artooras

+0

'fetch',''''''''''''或簡單地'dataWithCompletion:'。或者'loadDataAsynchronouslyWithCompletion:'如果你去那裏。或者'loadDataSynchronouslyWithCompletion:'。除*獲取*以外的任何內容。 :) – bbum

回答

-1

錯誤非常簡單。你忘了參數名稱。
爲此調整你的方法。
(BOOL gotData)這是你錯過的。

+ (void)getDataWithCompletion:(void (^)(BOOL gotData))completion { 

    //Some code... 
    completion(YES); 

}

這裏是鏈接到蘋果文檔​​

+0

那怎麼樣,你是對的。謝謝@Konstantin。代碼現在可用。嗯......我認爲在這個地方聲明輸入變量是可選的,我也沒有得到編譯器錯誤... – artooras

+0

這是錯誤的。參數名稱不是塊類型的一部分,實際上通常不應包括在內。 – newacct

+0

如果你提出了我的建議,xcode將使用正確的參數名稱 和這裏在蘋果文檔中說明 「參數名稱」的函數聲明的自動完成,如果你想使用參數,你需要給它一個名字。 http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Blocks/Art/blocks.jpg –

相關問題