如何仅在另一个函数完成时才调用一个函数? (Swift 并从 Parse 中检索)

How do I call a function only if another function is complete? (Swift and retrieving from Parse)

如果我在一个单独的函数中从我的 Parse 后端检索到某个 PFObject,我试图只调用一个函数 。目前我在 3.0 的设定延迟后调用第二个函数并且它正在工作,但前提是第一个查询函数在 3.0 内调用,否则我必须 pullToRefresh tableView 在第一个函数最终完成以填充 Parse 数据之后。 (顺便说一下,我使用的是 PFQueryTableViewController

这是我现在的代码(我知道 queryForTable 是一个重写,因此无论如何都会被调用,所以有没有办法将其更改为正常的功能?):

override func viewDidLoad() {

    // ideally want something like "if getX'IsComplete' then queryForTable() and self.loadObjects()"

    retrieveFirstX()

    let delay = 3.0 * Double(NSEC_PER_SEC) // retrieveFirstX must load within 3.0 for table to populate without needing to pullToRefresh
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue(), {

        self.queryForTable()
        self.loadObjects()
    })
}

var X = PFObject(className: "X")

func retrieveFirstX() -> Bool {

    let xQuery = PFQuery(className: "X")
    xQuery.orderByDescending("createdAt")
    xQuery.getFirstObjectInBackgroundWithBlock {
        (object: PFObject?, error: NSError?) -> Void in
        if error == nil {

            self.X = object!
        }
    }
    return true
}

 override func queryForTable() -> PFQuery {

    let xRelation = X.relationForKey("xPosts") as PFRelation!
    let relationQuery = xRelation.query()

    let xPostsQuery = PFQuery(className: "Posts")
    xPostsQuery.includeKey("postUser")
    xPostsQuery.whereKey("objectId", matchesKey: "objectId", inQuery: relationQuery)
    xPostsQuery.cachePolicy = .NetworkElseCache
    xPostsQuery.orderByDescending("createdAt")
    return xPostsQuery
}

我需要使用完成处理程序吗?如果需要,我该怎么做,因为我以前从未使用过它们?

提前致谢!

完成处理程序听起来不错,类似于:

override func viewDidLoad() {
    let completionHandler = {
        self.queryForTable()
        self.loadObjects()
    }
    retrieveFirstX(completionHandler)
}

func retrieveFirstX(completion: ()->()) -> Bool {
    let xQuery = PFQuery(className: "X")
    xQuery.orderByDescending("createdAt")
    xQuery.getFirstObjectInBackgroundWithBlock {
        (object: PFObject?, error: NSError?) -> Void in
        if error == nil {
            self.X = object!
            completion()
        }
    }
    return true
}