弹出ViewController时,停止执行GCD

Sid*_*Dev 7 objective-c grand-central-dispatch ios

-[tableView reloadData]在我的应用程序中有一个方法,并使执行更快,我已通过以下方法在GCD中调用它.

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

    [tableView reloadData];
});    
Run Code Online (Sandbox Code Playgroud)

但是当我弹出我的viewController时,应用程序崩溃了这条消息[SecondViewController numberOfSectionsInTableView:]: message sent to deallocated instance 0x7fe376206e10.我假设[reloadData]在从ViewController退出后仍然执行.我该如何停止执行?我应该把它变成NSOperation吗?如果是这样,我该怎么做?

Lan*_*nce 3

您的代码存在一些问题。以下是导致崩溃的事件顺序

1) 该块捕获 tableView 并使其保持活动状态。

2) 然后你的视图控制器被 pop 释放,

3) 该块执行,并且 tableView 调用它的数据源(您的视图控制器),该数据源现在已被释放。

您可以通过停止上面的 #1 或 #3 来解决这个问题。我建议#1。(我假设这里是ARC)

__weak UITableView *weakTableView = tableView;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [weakTableView reloadData];
});
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,则可能有其他原因使 tableView 保持活动状态。您应该调查究竟是什么在执行此操作,但您也可以通过阻止视图控制器方法中的 #3 来修复崩溃dealloc

- (void)dealloc {
    self.tableView.dataSource = nil;
    self.tableView.delegate = nil;
}
Run Code Online (Sandbox Code Playgroud)