2

データベース クラスを呼び出して loadPFObject を実行し、PFObject を返す VideoViewController クラスがあります。

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

次に、私のデータベース クラスには、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
}

行に投稿したコードの最初の部分でエラーが発生し続けます。

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

Optional 値のラップ解除中に予期せず nil が見つかったと表示されます。

loadPFObject は別のクラスにあるため、別のスレッドで実行され、その文字列値をアンラップするまでに PFObject のロードが完了していないと思います。

これを修正するにはどうすればよいですか? メインスレッドにタイマー一時停止を追加する必要がありますか、それともスレッドに関する私の仮定が完全に間違っていて、エラーはまったく別のものですか?

4

1 に答える 1

0

非同期コールバックでタイトルと URL にアクセスするコードを実行する必要があります。

使用する:

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

//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)
            }
        }
    }
}
于 2016-04-30T04:34:30.977 に答える