バックグラウンドでいくつかの作業を行い、完了ハンドラーを呼び出すライブラリを使用しています。すべて本当に標準です。
[[LastFm sharedInstance] getInfoForArtist:@"Pink Floyd" successHandler:^(NSDictionary *result) {
// Do stuff...
} failureHandler:nil];
私は実際にこれをテーブルビュー内で使用しています。すべてのセル(サブクラス)で、アーティストに関する情報を取得して表示します。これも問題です。セルを画面外に移動して別のアーティストに再利用する場合でも、前のアーティストのsuccessHandlerを実行できるため、ラベルと画像が連続して複数回変更されます。
私の考えは、NSOperationQueueを作成し、その中にgetInfoForArtist呼び出しを追加して、キャンセルできることを確認することでした。
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakOperation = operation;
[operation addExecutionBlock:^{
[[LastFm sharedInstance] getInfoForArtist:mediaItem.artist successHandler:^(NSDictionary *result) {
if (weakOperation.isCancelled) {
return;
}
// Do stuff...
} failureHandler:nil];
}];
[self.queue addOperation:operation];
問題はweakOperation
、successHandler内では常にnullであるということです。__block
の代わりに変更すると__weak
、weakOperation
は正しいインスタンスですが、そのisCancelled
状態は常にNO
です。
[self.queue cancelAllOperations];
セルが画面から移動した正しい時刻に電話をかけています。
だから私の質問は、セルが別のアーティストに再利用された後にsuccessHandlerが実行されないようにするにはどうすればよいですか?