2016-09-06 3 views
-1

Ich kodiere eine App in Swift, die das Auffüllen einer Tabelle basierend auf der Iteration von Informationen aus Arrays beinhaltet, die nach einer Datenbankabfrage angehängt werden. Ich habe die Abfrage, das Anfügen und die tableView.reloadData() alle in der viewDidLoad() Methode. Es funktioniert gut. Ich habe auch fast genau den gleichen Code in eine Refresh-Funktion geschrieben, die mit einem Zug auf dem Bildschirm reagiert. Es funktioniert auch gut. Das Problem ist jedoch, dass es sehr beschäftigt ist. Es gibt viel Code geschrieben zweimal und ich frage mich, was der beste Weg ist, das zu beheben. Hier ist der relevante Code:Wie kann die Code-Redundanz in Swift reduziert werden?

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

Die Refresh-Funktion:

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

Die Abfrage und Anfügen ist sehr lang, so würde ich einen besseren Weg, wie zu handhaben, dass als einfach den Code aus der viewdidload() kopieren und in die Refresh-Funktion einfügen und ein .endRefreshing() hinzufügen. Was ist der beste/effizienteste Weg, dies zu tun?

Dies ist alles in einem Tableviewcontroller getan.

+2

Warum also nicht die „Abfrage und anhängt "gerade aus in einem separaten func dass' viewDidLoad' und 'refresh' beide aufrufen? Es sieht so aus, als müsste diese Funktion auch einen Completion-Handler bereitstellen, damit Sie das Timing von 'endRefreshing' steuern können. Wenn "query and anhanging" in einem separaten Thread ausgeführt wird, benötigt 'viewDidLoad' ebenfalls' tableView.ReloadData() '. – Michael

+0

@Michael, tut mir leid, ja. Die ViewDidLoad hat eine .ReloadData(), ich habe vergessen, es in die Frage zu stellen. Was ist der beste Weg, um den Completion-Handler für die Aktualisierung einzurichten ... nicht so gut mit diesem Zeug. –

Antwort

1

Wie in meinem Kommentar besprochen, ziehen Sie den gemeinsamen Code in eine separate Funktion, die einen Abschluss-Handler hat. Ich bin etwas entlang der Linien des Denkens ...

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

In Protokoll orientiert:

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

} 

einfach einen Entwurf Schnipsel, getestet nicht

Verwandte Themen