1

Я пытаюсь только вызвать функцию только, если я извлек определенный PFObject из моего внутреннего блока Parse в отдельной функции. На данный момент я вызываю эту вторую функцию после заданной задержки 3.0, и она работает, но только если первая функция запроса вызывается в пределах 3.0, в противном случае у меня должно быть pullToRefreshtableView после того, как первая функция в конечном итоге будет завершена для ее заполнения с данными анализа. (Я использую PFQueryTableViewController кстати)Как вызвать функцию только в том случае, если другая функция завершена? (Swift и retrieve from Parse)

Вот мой код на данный момент (я знаю, 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 
} 

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

Заранее благодарен!

ответ

3

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

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 
} 
+0

Это сработало! Благодаря! - Кстати, queryForTable() теперь вызывается дважды, и я предполагаю, что он вызывается в viewDidLoad() и с ним является переопределяющим func. Знаете ли вы, что можно сделать queryForTable() не переопределяющим func так, что он вызывается только один раз при открытии приложения? –

+0

Я не знаю, но вы можете поставить точку останова в этой функции и каждый раз смотреть на трассировку стека, чтобы увидеть, откуда она вызывается. –

Смежные вопросы