2015-05-17 2 views
0

У меня есть класс, который расширяет PFQueryTableViewController. В этом классе implementation of queryForTable(), я пытаюсь получить некоторые данные, чтобы добавить для построения запроса, используя findObjectsInBackgroundWithBlock. Проблема в том, что поскольку findObjectsInBackgroundWithBlock является асинхронным, как использовать данные, которые я получаю от findObjectsInBackgroundWithBlock, и использовать его для построения query ниже и сделать return query.Как использовать findObjectsInBackgroundWithBlock в queryTable() класса PFQueryTableViewController

Мой код и ошибка показаны ниже.

override func queryForTable() -> PFQuery { 
    let query = PFUser.query() 
    //let query = PFQuery(className: "Room") 

    query?.whereKey("objectId", notEqualTo: PFUser.currentUser()!.objectId!) 

    //Showing OnlineUsers only 
    let onlineUsersQuery = PFQuery(className: "OnlineUsers") 
    onlineUsersQuery.whereKey("user", equalTo: PFUser.currentUser()!) 
    onlineUsersQuery.findObjectsInBackgroundWithBlock({ (results:[AnyObject]?, error:NSError?) -> Void in 

     let usersOnlineNow = results as! [PFObject] 
     for user in usersOnlineNow { 

      self.mLog.printToLog("Select only users who are in the OnLineUsers column") 
      query?.whereKey("objectId", equalTo: PFUser.currentUser()!.objectId!) 
      //query?.whereKey("objectId", equalTo: "noone") 

      if self.searchInProgress { 
       query!.whereKey("username", containsString: self.searchString) 
      } 

      if self.objects!.count == 0 { 
       //https://groups.google.com/forum/#!topic/parse-developers/7O9YCHNbuEo 
       query!.cachePolicy = PFCachePolicy.CacheThenNetwork //kPFCachePolicyCacheThenNetwork 
       //query.cachePolicy = kPFCachePolicyCacheThenNetwork 
      } 

      query!.orderByAscending("username") 

      return query! 

     } 

    }) 

//  query!.orderByAscending("username") 
//   
//  return query! 
} 

Picture showing function and error

+0

Может быть множество решений. Я бы создал запрос на завершение colsure и вызвал запрос «прямо там». Если он слишком сложный, установите переменную экземпляра PFQuery и обновите ее в завершении закрытия. Добавить свойство observer в свойство запроса и вызвать то, что вам нужно в didSet {} – kandelvijaya

ответ

0

Не делайте это там. Если вам нужна эта информация, чтобы заполнить таблицу, то получите ее, а затем создайте/перезагрузите таблицу, как только она появится, и вы можете создать соответствующий запрос.

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

0

Я бы создал запрос на завершение colsure и вызвал запрос «прямо там».

Если это слишком сложно, задайте переменную экземпляра PFQuery и обновите ее в завершении закрытия. Добавить объект наблюдатель свойства запроса и назвать то, что вам нужно в didSet {}

var query = PFUser.Query() 

    var finalquery:PFQuery{ 
    didSet{ 
     //call some function here 
     //executeQuery(query) 
    } 
} 

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

При установке значения из замыкания завершения вы используете текущую функцию queryForTable() для разбора фонового вызова.

onlineUsersQuery.findObjectsInBackgroundWithBlock({ (results:[AnyObject]?, error:NSError?) -> Void in 

    let usersOnlineNow = results as! [PFObject] 
    for user in usersOnlineNow { 

     self.mLog.printToLog("Select only users who are in the OnLineUsers column") 
     query?.whereKey("objectId", equalTo: PFUser.currentUser()!.objectId!) 
     //query?.whereKey("objectId", equalTo: "noone") 

     if self.searchInProgress { 
      query!.whereKey("username", containsString: self.searchString) 
     } 

     if self.objects!.count == 0 { 
      //https://groups.google.com/forum/#!topic/parse-developers/7O9YCHNbuEo 
      query!.cachePolicy = PFCachePolicy.CacheThenNetwork //kPFCachePolicyCacheThenNetwork 
      //query.cachePolicy = kPFCachePolicyCacheThenNetwork 
     } 

     query!.orderByAscending("username") 

     self.finalquery = query 

    } 

}) 

Дайте мне знать, если я понял неправильно, я попробую уточнить. Приветствия.

0

У меня была та же проблема. Когда загружается представление, вызывается queryForTable и идеально подходит для возврата запроса для pftable без задержки. Мой запрос потребовал несколько других запросов для ручной настройки условий. Поэтому я решил отправить фоновый поток, который будет строить реальный запрос, и немедленно вернуть pfquery, который выбрал правильный класс синтаксического анализа, но не строки.

Это приводит к тому, что queryForTable завершается успешно, а интерфейс таблицы визуализируется немедленно, без предупреждений о медленных pfqueries, запущенных в основном потоке. Затем, когда мой фоновый запрос заканчивается, я обновляю сохраненную переменную pfquery и вызываю таблицу reload table.

Логика:

  • на вид нагрузки, установить логическое флаг для queryIsReady к ложным, а значение pfquery, который возвращает класс без каких-либо строк

  • в queryForTable, если queryIsReady = = false, отправьте фоновый поток, чтобы создать реальный pfquery, и верните стандартную pfquery, которая не дает строк.

  • , когда фоновый поток завершается, установите переменную pfquery на новые значения, необходимые, и установить queryIsReady = True

  • вызов перезарядка табличные данные, которые будут повторно вызывать queryForTable

If любые другие действия заставляют queryForTable запускаться до завершения фонового потока, логическое queryIsReady будет ложным, и будет использоваться пустой набор результатов.