Как я могу вызвать функцию, только если другая функция завершена? (Свифт и получение из Parse)

Я пытаюсь вызвать функцию только в том случае, если PFObjectиз моего разбора бэкэнда в отдельную функцию. В данный момент я вызываю эту вторую функцию после заданной задержки 3.0 и это работает, но только если первая функция запроса вызывается внутри 3.0в противном случае я должен pullToRefresh tableView после того, как первая функция в конечном итоге завершена, она заполняется данными Parse. (Я использую PFQueryTableViewController Кстати)

Вот мой код на данный момент (я в курсе queryForTable переопределение так вызывается независимо, есть ли способ изменить это на обычный func?):

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
}

Нужно ли мне использовать обработчики завершения, и если да, то как мне это сделать, поскольку я никогда не использовал их раньше?

Заранее спасибо!

1 ответ

Решение

Обработчик завершения звучит правильно, что-то вроде:

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
}
Другие вопросы по тегам