我正在使用一個庫,在後臺執行一些工作,然後調用完成處理程序。所有非常標準。取消完成處理程序塊運行
[[LastFm sharedInstance] getInfoForArtist:@"Pink Floyd" successHandler:^(NSDictionary *result) {
// Do stuff...
} failureHandler:nil];
我實際上在tableview中使用這個:在每個單元格(子類)中,我得到關於藝術家的信息並顯示它。這也是問題:當單元格被移出屏幕並重新用於其他藝術家時,前一個藝術家的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內空。如果我將其更改爲__block
而不是__weak
,則weakOperation
是正確的實例,但其isCancelled
狀態始終爲NO
。
我在正確的時間打電話給[self.queue cancelAllOperations];
,當時單元格被移出屏幕。
所以我的問題是,如何防止在單元格被其他藝術家重用之後運行successHandler?