我正在使用一个在后台执行一些工作然后调用完成处理程序的库。一切都很标准。
[[LastFm sharedInstance] getInfoForArtist:@"Pink Floyd" successHandler:^(NSDictionary *result) {
// Do stuff...
} failureHandler:nil];
我实际上在 tableview 中使用它:在每个单元格(子类)中,我获取有关艺术家的信息并显示它。这也是问题所在:当单元格被移出屏幕并为另一个艺术家重用时,前一个艺术家的成功处理程序仍然可以执行,导致标签和图像快速连续多次更改。
我的想法是创建一个 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 在单元格被另一位艺术家重用后运行?