2015-10-29 8 views
2

У меня есть приложение, которое содержит табличный вид. В представлении таблицы отображаются данные, извлеченные из Parse. Чтобы получить количество строк, в которых я хочу, чтобы TableView был заполнен, я запрашиваю синтаксический анализ.Извлечение переменной из внешнего блока завершения Parse Swift

var activeGamesCurrentUser = 0 

    gamesQuery.countObjectsInBackgroundWithBlock({ 
      (count, error) -> Void in 
      let countedInt = Int(UInt32(count)) 
      self.activeGamesCurrentUser = countedInt 
     }) 

Но, когда я пытаюсь вернуться activeGamesCurrentUser для числа строк, всегда 0, так как переменная не обновляется вне блока завершения. Если я печатаю «countedInt» внутри блока, это число больше 0.

Я не хочу, чтобы решить эту проблему так:

var count = gamesQuery.countObjects() 
    activeGamesCurrentUser = count 

Причина этого в том, что «countObjects () "является синхронным и будет продолжать работать на переднем плане навсегда. Любая помощь по этому вопросу будет оценена по достоинству.

Edit:

Вот полный метод:

var activeGamesCurrentUser = 0 

func getRowNumber() { 
    if PFUser.currentUser() != nil && finished == true { 
     currentUserObjectId = PFUser.currentUser()?.objectId 
     let currentUser = PFUser.currentUser() 

     let challengedQuery = PFQuery(className: "Games") 
     challengedQuery.whereKey("challenged", equalTo:  currentUserObjectId) 

     let challengerQuery = PFQuery(className: "Games") 
     challengerQuery.whereKey("challenger", equalTo: (currentUser?.objectId)!) 

     let gamesQuery = PFQuery.orQueryWithSubqueries([challengedQuery, challengerQuery]) 

     gamesQuery.countObjectsInBackgroundWithBlock({ 
      (count, error) -> Void in 
      let countedInt = Int(UInt32(count)) 
      self.activeGamesCurrentUser = countedInt 
     }) 

     } 

    override func viewDidLoad() { 
    super.viewDidLoad() 


    getRowNumber() 
    } 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {   

    return activeGamesCurrentUser 
    } 
+0

После загрузки данных таблицы в фоновом режиме, вам нужно вызвать 'tableView.reloadData()' для того, чтобы рассказать TableView, что данные изменились – Paulw11

+0

я называю tableView.reloadData() уже. Моя проблема заключается не в получении данных для заполнения строк, а в определении количества строк, которые должны иметь табличные представления. Я не могу найти способ получить переменную «activeGamesCurrentUser» из блока завершения, если ее значение не вернется к 0. @ Paulw11 –

+0

Этот код установит свойство. Когда вы пытаетесь получить доступ к его значению в связи с этим закрытием? то есть. Как код знает, что печатает значение, знаете, что закрытие завершено? – Paulw11

ответ

3

Пара вещей -

Первый, всегда доступ к свойствам класса внутри блока со слабой ссылкой на себя ,

Второй, перезагрузите таблицу после завершения вашей модификации.

weak var aBlockSelf = self 

gamesQuery.countObjectsInBackgroundWithBlock({ 
      (count, error) -> Void in 
      let countedInt = Int(UInt32(count)) 
      aBlockSelf.activeGamesCurrentUser = countedInt 
      aBlockSelf.tableView.reloadData() 
     }) 
+0

Вам не всегда нужна слабая самооценка; только если есть шанс на удержание цикла, которого нет в этом случае. – Paulw11

+0

@ Paulw11, но в этом случае, не делая ссылку слабым, вы в конечном итоге сохраняете контроллер даже после того, как он выскочил из стека (если запрос длится долго). Сделать это слабым предотвращает это –

+0

. В этом случае это не имеет значения, но в некоторых случаях вам может потребоваться, чтобы контроллер просмотра зависал до завершения сетевой операции, так как может быть выполнена другая работа, например, после сохранения. Вы не должны * всегда использовать слабую ссылку, и в большинстве случаев ее использование не будет иметь большого эффекта, чем продление срока жизни объекта – Paulw11

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