私はデリゲートパターンに精通していて、特にビューコントローラが消えるときに進行中の非同期呼び出しを行うときには、私はデリゲートをnilし、コールバックは正常にnilオブジェクトに戻ります。完成ブロックからゾンビから自分のコードを保護する
私は現在、コードを少し読みやすくするために補完ブロックを使って実験しています。
私のビューコントローラからネットワークサービスを呼び出し、私のUITableViewを更新するブロックを渡します。通常の状況下では正常に動作します。ただし、完了する前にビューを終了すると、完了ハンドラブロックが実行されますが、UITableViewは現在ゾンビになっています。
これを処理する通常のパターンは何ですか?
コードサンプルWITH UPDATE
これは私が分割ビューのように、一度に画面上の2つのビューコントローラを持って、iPadアプリです。 1つはディテールであり、もう1つは画像のグリッドです。私はイメージをクリックし、詳細をロードして情報をロードします。しかし、私が画像をクリックすると、あまりにも早く、ネットワーク通話をする機会があります。問題があります。画像を変更すると、画像のお気に入りを数える以下のコードが呼び出されます。
これは私のジレンマです。以下のコードを使用すると、これはうまくいきます。ネットワークが応答します。
__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];
}];
ヒントはありますか?おかげ
SECOND UPDATE
は、私はお気に入りをロードする方法を変更しました。お気に入りがシングルトンである代わりに、私は各写真の変更時にインスタンスを作成します。
[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
このインスタンスでは、私はあなたが正しいと思います。私はブロックプログラミングガイドに戻り、 "__blockストレージタイプ修飾子でマークされたオブジェクト変数は残っていません"という....を再読み込みしていました。しかし、これは私のView Controllerがまだそこにあったからです...もしそうでなければどうしますか?それとも、生き続けるブロックのためにいつもそこにいるのだろうか?ああ脳の痛み... – bandejapaisa
+1「ゾンビから自分のコードを保護する」;-) –