2016-09-06 8 views
-1

私はSwiftのアプリケーションをコーディングしています。これは、データベースクエリの後に追加された配列の情報を反復してテーブルを生成することです。私はviewDidLoad()メソッドのクエリ、追加、およびtableView.reloadData()を持っています。それはうまく動作します。私はまた、ほぼ同じコードを画面上のプルで応答するリフレッシュ機能に書き込んだ。それはうまくいく。しかし、問題はそれが非常に忙しいということです。 2回書かれたコードがたくさんあります。私はそれを修正する最良の方法が何であるか疑問に思っています。 viewDidLoad()Swiftのコード冗長性を減らすには?

:ここに関連するコードがある

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'のタイミングを制御することができます。 "query and appending"が別のスレッドで行われていると仮定すると、 'viewDidLoad'は' tableView.reloadData() 'も必要とします。 – Michael

+0

@Michael、申し訳ありません。 viewDidLoadは.reloadData()を持っていますが、私は質問にそれを入れるのを忘れていました。どのようなリフレッシュのための完了ハンドラを設定するための最良の方法は...あまりにも良いものではありません。 –

答えて

1

私のコメントで説明したように、共通コードを完成ハンドラを持つ別のfuncに引き出します。私は、プロトコル指向のように

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() 
    } 
} 

}