能否为指定代码段定义typealias?iOS刷新UITableView重复代码替代方案问询
是否可以为这段代码定义typealias?
不可以。typealias的作用是为已有类型定义别名,属于类型层面的重命名,无法直接封装可执行的代码逻辑。即使你为() -> Void这类闭包类型定义别名,也无法将具体的tableView刷新逻辑内置进去,达不到减少重复代码的目的,没有实际使用价值。
可行的替代实现方案
方案1:封装当前ViewController私有方法
在当前ViewController的实现或私有扩展中新增方法即可,注意添加[weak self]避免循环引用:private func reloadTableViewSafely() { DispatchQueue.main.async { [weak self] in self?.tableView.reloadData() } }后续需要刷新的位置直接调用
reloadTableViewSafely()即可。方案2:封装UITableView全局扩展(复用性最高)
直接给系统UITableView类添加扩展,项目内所有用到UITableView的位置都可以直接调用:extension UITableView { func reloadOnMainThread() { DispatchQueue.main.async { [weak self] in self?.reloadData() } } }调用方式非常简洁:
tableView.reloadOnMainThread()。方案3:封装UIViewController全局扩展
如果项目中多个ViewController都有UITableView刷新需求,也可以给UIViewController加扩展:extension UIViewController { func reloadTableViewOnMain(_ tableView: UITableView) { DispatchQueue.main.async { [weak self] in guard let _ = self else { return } tableView.reloadData() } } }调用时传入当前tableView实例即可:
reloadTableViewOnMain(tableView)。方案4:封装全局主队列调度工具
如果你还有其他UI操作需要切主队列执行,可以封装通用的主队列执行工具,还可以增加主线程判断避免不必要的调度开销:func executeOnMain(_ block: @escaping () -> Void) { if Thread.isMainThread { block() } else { DispatchQueue.main.async(execute: block) } }刷新时调用写法为:
executeOnMain { self.tableView.reloadData() },其他所有需要切换到主队列执行的UI操作都可以复用这个方法。
内容的提问来源于stack exchange,提问作者Dayanithi Natarajan

