2016-09-06 75 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() 
    } 
} 

} 

只是一個片斷草案,沒有測試