我认为之前有过类似的问题.不幸的是,他们都没有解决我面临的问题.
我的问题结构非常简单.我有两个视图控制器,比如VC1和VC2.在VC1中,我显示了一个UITableView中的一些项目列表,从数据库加载,在VC2中我显示了所选项目的详细信息,并进行编辑和保存.当用户从VC2返回VC1时,我必须重新填充数据源并重新加载表.VC1和VC2都嵌入在UINavigationController中.
听起来非常微不足道,确实是这样,直到我在UI线程中做了所有事情.问题是在VC1中加载列表有点费时.因此,我必须将繁重的数据加载任务委托给一些后台工作线程,并在数据加载完成时重新加载主线程上的表,以提供流畅的UI体验.所以我的初始构造类似于以下内容:
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
dispatch_async(self.application.commonWorkerQueue, ^{
[self populateData]; //populate datasource
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData]; //reload table view
});
});
}
Run Code Online (Sandbox Code Playgroud)
这个功能非常实用,直到iOS10从viewWillAppear:停止立即渲染viewWillAppear开始,并开始将其viewWillAppear视为注册请求,以便prepareForSegue在运行循环的某些后续迭代中重新加载.所以我发现我的应用程序开始偶尔崩溃,如果UITableView在后续调用之前没有完成reloadData,这是非常明显的,因为reloadData不再是线程安全的,如果数据源在完成之前更改UITableView很可能会使应用程序崩溃.所以我尝试添加一个信号量以使[self.tableView reloadData]线程安全,我发现它工作得很好.我后来的构造类似于以下内容:
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
dispatch_async(self.application.commonWorkerQueue, ^{
[self populateData]; //populate datasource
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData]; //reload table view
dispatch_async(dispatch_get_main_queue(), ^{
dispatch_semaphore_signal(self.datasourceSyncSemaphore); //let the app know that it is free to repopulate datasource again
});
});
dispatch_semaphore_wait(self.datasourceSyncSemaphore, DISPATCH_TIME_FOREVER); //wait …Run Code Online (Sandbox Code Playgroud) 假设我有课
class Foo {
doSomething() { throw 'error'; }
doOtherthing() { throw 'error2'; }
handleError(e) {}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,是否有任何实现可以自动拦截/捕获此类中发生的任何错误并将其重定向到错误处理方法 handleError()
例如
const foo = new Foo()
foo.doSomething()
Run Code Online (Sandbox Code Playgroud)
那应该会触发 errorHandler()。Angular 有这样的实现,我不确定它是如何完成的。