2016-03-20 3 views
0

Ich habe eine UITableView und vor kurzem habe ich eine Pull-to-Refresh-Funktion hinzugefügt.Wie kann ich mein UIRefreshControl nur ausblenden, wenn das Abrufen der Daten abgeschlossen ist (in Swift)?

Bisher sieht der Code wie folgt aus:

@IBOutlet var tview: UITableView! 
var currentDate: NSDate = NSDate() 

override func viewDidLoad(){ 

    let refreshControl = UIRefreshControl() 

    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged) 
    refreshControl.attributedTitle = NSAttributedString(string: "last updated on \(currentDate)") 


    tview.separatorStyle = UITableViewCellSeparatorStyle.None 
    tview.addSubview(refreshControl) 
} 

func refresh(refreshControl: UIRefreshControl) { 

    refreshControl.attributedTitle = NSAttributedString(string: "last updated on \(currentDate)") 

    fetchRequests() 

} 

Wie man sehen kann ich eine Funktion fetchRequests() in der Refresh-Steuerfunktion bin aufrufen, auch die attributedTitle da ich die Einstellung der Benutzer das letzte Mal zu zeigen, des Updates.

Meine Funktion fetchRequests() eine Webservice aufruft und die Daten abruft asynchron:

func fetchRequests(){ 
    Alamofire.request(.GET, "https://mywebservice", parameters: ["username": username]) 
     .responseJSON { response in 
      switch response.result { 
      case .Success: 

       self.items.removeAllObjects() 
       if let jsonData = response.result.value as? [[String: AnyObject]] { 
        for requestJSON in jsonData { 
         if let request = SingleRequest.fromJSON(JSON(requestJSON)){ 
          self.items.addObject(request) 
          dispatch_async(dispatch_get_main_queue(),{ 
           self.tview.reloadData() 
           self.refreshControl?.endRefreshing() 
           self.currentDate = NSDate() 
          }) 

         } 
        } 
       } 
       //self.tview.reloadData() 

      case .Failure(let error): 
       print("SWITCH ERROR") 
       print(error) 
      } 

    } 
} 

und ich möchte die refreshControl verstecken, wenn die Aktualisierung abgeschlossen ist.

Diese Zeile:

self.refreshControl?.endRefreshing() 

innerhalb des success Fall in fetchRecords funktioniert nicht. Wie kann ich von dort auf das refreshControl verweisen und es im Erfolgsfall beenden? Auch zur Zeit ich aus der Leitung am Ende der fetchRecords kommentiert:

//self.tview.reloadData() 

, weil ich glaube/hoffe, dass Nachladen Platz innerhalb dispatch_async nimmt - ist, dass eine gute Annahme?

Antwort

0

Während der Dienst einen Hintergrundthread aufruft, können Sie die Benutzeroberfläche nicht aktualisieren. Wenn Sie eine Antwort erhalten, dann analysieren Sie parse und Benutzerschnittstelle innerhalb von dispatch_get_main_queue.

func fetchRequests(){ 
    Alamofire.request(.GET, "https://mywebservice", parameters: ["username": username]) 
     .responseJSON { response in 
dispatch_async(dispatch_get_main_queue(),{ 
      switch response.result { 
      case .Success: 

       self.items.removeAllObjects() 
       if let jsonData = response.result.value as? [[String: AnyObject]] { 
        for requestJSON in jsonData { 
         if let request = SingleRequest.fromJSON(JSON(requestJSON)){ 
          self.items.addObject(request) 

           self.tview.reloadData() 
           self.refreshControl?.endRefreshing() 
           self.currentDate = NSDate() 


         } 
        } 
       } 
       //self.tview.reloadData() 

      case .Failure(let error): 
       print("SWITCH ERROR") 
       print(error) 
      } 

    } 
}) 
} 
+0

aber ist das nicht, was ich jetzt mache, wenn ich 'self.refreshControl? .endRefreshing()' innerhalb von 'dispatch_async (dispatch_get_main_queue(), {'? Denn wenn ja, dann funktioniert es leider nicht. .. – randomuser1

0

Was Sie hier falsch machen, ist Ihr refreshControl Objekt lokal ist und nur in viewDidLoad verfügbar ist so, auch wenn Sie in fetchRequest verwenden() wird es nicht funktionieren. Übergeben Sie Ihr refreshControl-Objekt an die Funktion fetchRequests. Versuchen Sie unter Sache:

func refresh(refreshControl: UIRefreshControl) { 
refreshControl.attributedTitle = NSAttributedString(string: "last updated on \(currentDate)") 
fetchRequests(refreshControl) 
} 

func fetchRequest(refreshControl: UIRefreshControl) { 
    //existing code.... 
    dispatch_async(dispatch_get_main_queue(),{ 
          self.tview.reloadData() 
          refreshControl?.endRefreshing() 
          self.currentDate = NSDate() 
         }) 
} 

Wenn Sie Ihre Eingabe fetchRequests func innen func refresh bewegen (refreshControl: UIRefreshControl) wird auch funktionieren.

+0

Danke, aber ich habe gerade zwei Dinge hier realisiert - das erste: 'self.tview.reloadData()' läuft mehrmals, weil es in der Schleife ist und so oft aktualisiert wird, wie Datensätze abgerufen werden, nachdem jeder Datensatz aktualisiert wurde Tabellenansicht, damit ich den Auffrischungskurs dort nicht beenden kann, weil es xx mal aufgerufen wird, sollte ich 'endRefreshing' nur einmal nach der Schleife machen - wie kann ich das erreichen? – randomuser1

+0

Die andere Sache ist, dass ich es lokal erstellt habe weil es bereits ein refreshControl im UITableViewController gibt und meine Klasse es erbt: 'class UserList: UITableViewController {' also wusste ich nicht, wie man den refresh controller von diesem cl benutzt ass ... – randomuser1

+0

Verschieben Sie den Dispatch-Block außerhalb und nach der for-Schleife und sehen, ob es funktioniert. Wofür ist SingleRequest hier, ist es ein weiterer Serviceanruf? –

Verwandte Themen