2016-09-06 80 views
-1

我正在编写一个Swift中的应用程序,它涉及通过遍历数据库查询后附加的数组中的信息来填充表。我有viewDidLoad()方法中的查询,追加和tableView.reloadData()。它工作正常。我也有几乎完全相同的代码写入刷新函数,并在屏幕上进行响应。它也很好。但问题在于它非常繁忙。有很多代码写了两次,我想知道什么是解决这个问题的最好方法。下面是相关代码:如何减少Swift中的代码冗余?

viewDidLoad()

override func viewDidLoad() { 
     super.viewDidLoad(){ 
//run query, append arrays 
self.tableView.reloadData() 
}refreshControl = UIRefreshControl() 
     refreshControl!.attributedTitle = NSAttributedString(string: "Pull to refresh") 
     refreshControl!.addTarget(self, action: #selector(DisplayEventsTVC.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged) 
} 

刷新功能:

func refresh(sender: AnyObject){{ 
    //exact same query and appending 
} 
    self.tableView.reloadData() 
    self.refreshControl?.endRefreshing() 
    } 

查询和追加是很长,所以我想一个更好的方式来处理而不是简单地将viewdidload()中的代码复制并粘贴到刷新函数中并添加.endRefreshing()。什么是最好/最有效的方式来做到这一点?

这一切都是在tableviewcontroller中完成的。

+2

那么,为什么不是“查询追加“在'viewDidLoad'和'refresh'两个独立的函数中调用?看起来这个func需要提供一个完成处理程序,所以你可以控制'endRefreshing'的时间。假设“查询和追加”是在一个单独的线程中完成的,那么'viewDidLoad'也需要'tableView.reloadData()'。 – Michael

+0

@Michael,对不起,是的。 viewDidLoad确实有一个.reloadData(),我忘了把它放在问题中。什么是设置完成处理程序以进行刷新的最佳方式...对于那些东西来说不太好。 –

回答

1

正如我的评论中所讨论的,将公共代码拉出到一个具有完成处理程序的单独函数中。我想沿着线的东西...

override func viewDidLoad() { 
    super.viewDidLoad() 
    queryAndAppend(completion: { 
     self.tableView.reloadData() 
    }) 
    refreshControl = UIRefreshControl() 
    refreshControl!.attributedTitle = NSAttributedString(string: "Pull to refresh") 
    refreshControl!.addTarget(self, action: #selector(DisplayEventsTVC.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged) 
} 

func refresh(sender: AnyObject) { 
    queryAndAppend(completion: { 
     self.tableView.reloadData() 
     self.refreshControl?.endRefreshing() 
    }) 
} 

func queryAndAppend(completion completion: (() -> Void)?) { 
    // your existing code goes here 
    if let completion = completion { 
     completion() 
    } 
} 
2

在协议中化之路:

class ViewController: UIViewController, Refreshable { 
    var refreshTitle: String = "Pull to refresh" 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     queryAndAppend(completion: { 
      self.tableView.reloadData() 
     }) 
     self.setupRefresh()//I don't want to name it 
    } 
} 

//Somewhere else 
protocol Refreshable { 
    var refreshTitle: String {get} 
    var tableView: UITableView 
    var refreshControl: UIRefreshControl 
} 

extension Refreshable where Self: UIViewController { 
func setupRefresh(){ 
refreshControl = UIRefreshControl() 
    refreshControl!.attributedTitle = NSAttributedString(string: "Pull to refresh") 
    refreshControl!.addTarget(self, action: #selector(DisplayEventsTVC.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged) 
} 

//copying from @Michael ans 
func refresh(sender: AnyObject) { 
    queryAndAppend(completion: { 
     self.tableView.reloadData() 
     self.refreshControl?.endRefreshing() 
    }) 
} 

func queryAndAppend(completion completion: (() -> Void)?) { 
    // your existing code goes here 
    if let completion = completion { 
     completion() 
    } 
} 

} 

只是一个片断草案,没有测试