我熟悉委託模式和nilling我的委託,特別是當我的視圖控制器消失時仍在進行異步調用。我沒有委託,回調成功返回一個零對象。保護我的代碼免於殭屍從完成塊
我現在正在嘗試使用完成塊來使我的代碼更容易閱讀。
我從我的視圖控制器調用網絡服務,並通過一個塊更新我的UITableView。在正常情況下,它工作正常。但是,如果我在視圖完成之前離開視圖,則會執行完成處理程序塊 - 但UITableView現在是一個殭屍。
最常見的處理方式是什麼?
WITH代碼示例
這是iPad程序UPDATE,我有個屏幕視圖控制器一次,像一個拆分視圖。一個是細節,另一個是圖像網格。我點擊一個圖像,它告訴詳細信息加載信息。但是,如果在他們有機會進行網絡通話之前點擊圖像速度太快 - 我遇到問題。在不斷變化的圖片下面的代碼被稱爲其計數圖像的最愛....
因此,這裏是我的困境,如果我用下面的代碼 - 它工作正常,但它在工具,如果你之前的切換圖像泄露網絡響應。
如果我刪除__block並自己傳入,那麼它會與殭屍崩潰。
我不能贏......我確定我錯過了關於使用塊的基本知識。
__block UITableView *theTable = [self.table retain];
__block IndexedDictionary *tableData = [self.descriptionKeyValues retain];
FavouritesController *favourites = [Container controllerWithClass:FavouritesController.class];
[favourites countFavouritesForPhoto:self.photo
completion:^(int favesCount) {
[tableData insertObject:[NSString stringWithFormat:@"%i", favesCount]
forKey:@"Favourites:" atIndex:1];
[theTable reloadData];
[tableData release];
[theTable release];
}];
任何提示?由於
第二次更新
我改變了我加載的最愛的方式。而不是最喜歡的單身人士,我在每次更改照片時創建一個實例。通過更換這並殺害舊 - 塊無處可回調(我猜它甚至不存在)和我的代碼現在看起來就像下面的,它似乎工作:
[self.favourites countFavouritesForPhoto:self.photo
completion:^(int favesCount) {
[self.descriptionKeyValues insertObject:[NSString stringWithFormat:@"%i", favesCount]
forKey:@"Favourites:" atIndex:1];
[self.table reloadData];
}];
它不會泄漏,也不會崩潰。
'retain' +'release'?但我不確定保證完成塊將被執行 – Nekto 2012-02-18 13:54:21
在這種情況下,我認爲你是對的。我回到塊編程指南,並重新閱讀,「標記爲__block存儲類型修飾符的對象變量,但不保留」....我正在做。但是,這是因爲我的視圖控制器還在那裏...如果不是?或者它總是在那裏,因爲該塊保持活着?啊腦頭疼...... – bandejapaisa 2012-02-18 14:02:38
+1爲'保護我的代碼從殭屍';-) – 2012-02-18 14:37:27