2016-04-30 15 views
2

Ich habe eine VideoViewController-Klasse, die meine Datenbank-Klasse aufruft und ein loadPFObject ausführt und das ein PFObject zurückgibt.Swift iOS, wie man einen Thread pausiert

var db = VideoDatabaseHandler() 
var video_titles = [String]() 
var video_urls = [String]() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    //Load video list 
    let video_list = db.loadPFObject("TutorialVids") 
    video_titles = video_list["titles"] as! [String] 
    video_urls = video_list["urls"] as! [String] 
    self.tableView.reloadData() 
} 

Dann in meiner Datenbank-Klasse hier ist die Funktion des PFObject

//This function loads a PFObject from the database 
func loadPFObject(category: String) -> PFObject { 
    let query = PFQuery(className: category) 
    var db_obj = PFObject(className: category) 

    if(category == "TutorialVids"){ 
     query.getObjectInBackgroundWithId("vpWEueKv5O"){ 
      (tutVideos: PFObject?, error: NSError?) -> Void in 

      //successfully loaded video lists 
      if(error == nil && tutVideos != nil) { 
       db_obj = tutVideos! 
      } 

       //Error loading video lists 
      else{ 
       print(error) 
      } 
     } 
    } 
    print(db_obj) 
    return db_obj 
} 

Ich erhalte einen Fehler in meinem ersten Teil des Codes zurück ich auf der Linie geschrieben:

video_titles = video_list["titles"] as! [String] 

Es sagt unerwartet gefunden Null beim Auspacken eines optionalen Werts.

Ich glaube, dass das loadPFObject, da es in einer anderen Klasse ist, auf einem anderen Thread ausgeführt wird und das PFObject nicht bis zum Entpacken des Zeichenfolgenwerts fertig geladen ist.

Was würde ich tun, um dies zu beheben? Sollte ich eine Timerpause im Hauptthread hinzufügen oder ist meine Annahme über die Threads völlig falsch und der Fehler ist etwas ganz anderes?

+0

See: http://stackoverflow.com/questions/24726723/stop-pause-swift-app-for-period-of-time und http://stackoverflow.com/questions/27517632/how-to-create-a-delay-in-swift – WBT

+0

Ist ein Schlaf/Pause die beste Methode zur Behandlung meines Problems oder gibt es eine bessere Möglichkeit zu wissen, wenn dieser Thread beendet ist ? –

+0

Rückrufe sind besser als Schlaf, aber die Links basieren in erster Linie darauf, wie Sie Ihre Frage betitelt haben. – WBT

Antwort

0

Sie müssen den Code ausführen, der auf die Titel und URLs in einem asynchronen Callback zugreift.

Verwendung:

var db = VideoDatabaseHandler() 
var video_titles = [String]() 
var video_urls = [String]() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    //Load video list 
    db.loadPFObject("TutorialVids") { video_list in 
     video_titles = video_list["titles"] as! [String] 
     video_urls = video_list["urls"] as! [String] 
     self.tableView.reloadData() 
    } 
} 

und

//This function loads a PFObject from the database 
func loadPFObject(category: String, onSuccess: (PFObject -> Void)){ 
    let query = PFQuery(className: category) 

    if(category == "TutorialVids"){ 
     query.getObjectInBackgroundWithId("vpWEueKv5O"){ 
      (tutVideos: PFObject?, error: NSError?) -> Void in 

      //successfully loaded video lists 
      if(error == nil && tutVideos != nil) { 
       onSuccess(tutVideos!) 
      } 

       //Error loading video lists 
      else{ 
       print(error) 
      } 
     } 
    } 
}