Objective c 取消运行完成处理程序块

Objective c 取消运行完成处理程序块,objective-c,objective-c-blocks,nsoperation,Objective C,Objective C Blocks,Nsoperation,我使用的库在后台执行一些工作,然后调用一个完成处理程序。一切都很标准 [[LastFm sharedInstance] getInfoForArtist:@"Pink Floyd" successHandler:^(NSDictionary *result) { // Do stuff... } failureHandler:nil]; 我实际上是在tableview中使用它:在每个单元格(子类)中,我都会获得艺术家的信息并显示出来。这也是一个问题:当单元格移出屏幕并重新用于另一位艺术

我使用的库在后台执行一些工作,然后调用一个完成处理程序。一切都很标准

[[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];
问题是在successHandler中,
weakOperation
始终为空。如果我将其更改为
\uu block
而不是
\uu weak
weakOperation
是正确的实例,但其
已取消
状态始终为

我正在呼叫
[self.queue cancelAllOperations]在单元格移出屏幕的正确时间


因此,我的问题是,如何防止successHandler在单元格被其他艺术家重新使用后运行?

问题是您正在调用异步API。操作的生命周期是调用
getInfoForArtist:successHandler:
,它可能会立即返回。执行异步回调时,操作已被处理,这就是回调块中引用为nil的原因

在执行successHandler时,取消操作是没有意义的——您不需要保存网络资源,也可以将查找结果保存在本地。UI的问题是,您不应该直接引用单元格(或其子视图,如果您重用它们的话)。您可以考虑将结果存储在一个本地<代码> NSCORCHOR> 中,键入该行的<代码> NSIndexPath < /代码>,或艺术家ID。然后,在您的代码> CyfFurWaldRexXPATT:<代码>中,首先在进行LASFM调用之前检查该字典。在successHandler回调中,您可以迭代tableView的
VisibleCell
,并尝试从字典中加载数据