2014-04-04 36 views
0

在Objective-c中,我們聲明瞭一個完成塊,它充當Web請求的回調。塊內部調用塊

如果請求失敗,那麼我希望能夠再次調用該函數,從完成區塊內。當我這樣做時,我得到EXC_BAD_ACCESS,由於該塊沒有完全定義。

這是煩人,因爲在Java中,我可以做到這一點跟聽衆。

是否有可能從內部調用完成塊?

謝謝。

下面的代碼引發錯誤,我怎麼能解決這個問題嗎?

CustomErrorBlock errorBlock = ^(NSError *error) { 

    _processing = NO; 
    loadingView.hidden = YES; 

    self.infoText.hidden = NO; 
    self.infoText.text = @"A network connection error has occurred."; 
}; 


CustomCompletionBlock completionBlock = ^(NSData *data){ 

    if(![self processGetTransactions:data withDict:updateDict]) { 

     [webClient getTransactions:updateDict WithCompletionBlock:completionBlock andErrorBlock:errorBlock]; 
    } 
}; 
[webClient getTransactions:updateDict WithCompletionBlock:completionBlock andErrorBlock:errorBlock]; 
+0

你可以發佈所有的功能。 – bsarr007

+0

你是否複製了completionBlock? –

+0

你是指複製品? – conor

回答

0

應該能夠通過使用__block告訴編譯器它必須以一種特殊的方式進行處理,並停止EXC_BAD_ACCESS崩潰也__weak這使得對象不保留強。

__block CustomErrorBlock errorBlock = ^(NSError *error) { 

    _processing = NO; 
    loadingView.hidden = YES; 

    self.infoText.hidden = NO; 
    self.infoText.text = @"A network connection error has occurred."; 
}; 


__block CustomCompletionBlock completionBlock = ^(NSData *data) { 

    if(![self processGetTransactions:data withDict:updateDict]) { 
     __weak CustomCompletionBlock weakCompletionBlock = completionBlock; // Note seems to always have retain cycle 

     [webClient getTransactions:updateDict WithCompletionBlock:weakCompletionBlock andErrorBlock:errorBlock]; 
    } 
}; 

    [webClient getTransactions:updateDict WithCompletionBlock:completionBlock andErrorBlock:errorBlock]; 

注意:弱對象仍然顯示關於由於某種原因強對象的消息,但它在沒有任何問題的情況下工作。