2016-07-09 19 views
1

Ich habe es hier mit einem Problem zu tun. Ich mache eine Abfrage (innerhalb einer Funktion) für eine Tabelle in Parse und ich bekomme einige Objectids. Ich schiebe sie in ein Array.Swift 2 Funktionen Fertigstellung

Im ViewDidLoad Ich habe die folgende Reihenfolge

override func viewDidLoad() { 
     super.viewDidLoad() 

    refreshControl = UIRefreshControl() 
    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh") 
    refreshControl.addTarget(self, action: #selector(Images.refresh), forControlEvents: UIControlEvents.ValueChanged) 
    self.imagesCollView!.addSubview(refreshControl) 
    queryLikes() // it calls first the likes query 
    queryImages("") // and when the previous query has done, it should run this query. 
} 

und bei cellForItemAtIndexPath ich, wenn die Objekt-ID des Bildes bin Überprüfung innerhalb der Anordnung der ObjectIDs enthalten ist, und dann den Hintergrund einer Schaltfläche ändern aus nicht gefallen zu mögen. Alle gut bis jetzt, aber ich habe auch eine Aktualisierungsfunktion, die etwas wie die

@IBAction func refreshButt(sender: AnyObject) { 
    queryLikes() //this first call to the query of likes table 
    searchBar.text = "" 
    categoryStr = "" 
    queryImages("") //and when the previous query is ready, it should run this query. 
} 

So ist, wenn jemand die Ansicht mit der Schaltfläche manchmal aktualisieren lädt es die zweite Abfrage zuerst und dann dem ersten.

Gibt es irgendein Arbeitsbeispiel, um mir zu zeigen, wie die queryLikes IMMER zuerst ausgeführt wird und wann es fertig ist, die queryImages ??

Vielen Dank!

Antwort

3

Sie können dies erreichen, indem Rückrufe und Verkettungs die Anfragen mit:

enum Result<T> { 
    case Success(T) 
    case Failure(NSError) 
} 


func queryLikes(completion: Result<Void> -> Void) { 
    if networkCallSuccess() { completion(.Success()) } 
    else { completion(.Failure(.Error)) } 
} 

queryLikes() { result in 
    switch result { 
    case .Success: queryImages() 
    case .Failure(let error): // Handle error 
    } 

} 
+0

wenn ich einfügen versuchen, 'Abschluss (.Success())' in meinem 'queryLikes' Erfolg es mir den Fehler gibt' nennt Wert kann nicht von Nicht-Funktionstyp ‚Ergebnis ‘ (auch bekannt als ‚Ergebnis <()>‘) 'Ich habe die' enum' direkt unter den Importen platziert .. fehlt mir etwas? Soll ich die Frage mit den kompletten Funktionen aktualisieren? –

+1

Jetzt verstehe ich vollständig, was die Vervollständigung in einem Start ist. Vielen Dank Diogo !! funktionierte auch wie ein charme: D –

2

Dies ist eine viel einfachere Art und Weise mit der Situation zu umgehen. Aber ich würde die Antwort von Diogo Antunes eher als diese Annäherung empfehlen, Sie können damit gehen, wenn Sie ein Anfänger sind.

func queryLikes(completion: (success : Bool) ->()) { 
    // After putting your statements 
    completion(success: true) 
} 

Wenn Sie mit Bedingungen innerhalb der Funktion zu tun haben, versuchen Sie dies.

func queryLikes(completion: (success : Bool) ->()) { 

      if condition { 
       completion(success: true) 
      } 
      else { 
       completion(success: false) 
      } 
     } 

Verwendung einer for-Schleife innerhalb der Funktion.

func queryLikes(completion: (success : Bool) ->()) { 

      let objects : [Int] = [] 

      for object in 0..<objects.count 
      { 
       if object == objects.endIndex 
       { 
        completion(success: true) 
       } 
      } 
     } 
+1

beide antworten sind richtig und beide funktionierten! Aber ich habe Diogos Antwort akzeptiert, weil er zuerst geantwortet hat. Vielen Dank für Ihre Hilfe: D –

+1

@KwnstantinosNatsios Keine Probleme, seine Antwort ist der bevorzugte Weg. –