2

我有一个 VideoViewController 类,它调用我的数据库类并执行 loadPFObject 并返回一个 PFObject。

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 回答