2015-06-12 2 views
2



Я просмотрел все переполнение стека и другие веб-ресурсы о том, как обрабатывать запрос async PARSE и хранить эти данные в массиве. Затем я использую этот массив для заполнения таблицы в другом контроллере представления. Структура кода выглядит следующим образом:Реализация GCD не работает с запросом PARSE (Swift)

AppController.swift:

public var BuisnessNames = [NSString]() 
[...] 
public func updateFeedsMap(){ 

    var query : PFQuery = PFUser.query()! 
    var objects : [AnyObject]? 
    var counter = 0 

    query.whereKey("isProprietor", equalTo: true) 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]?, error: NSError?) -> Void in 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
      if error == nil { 
       // The find succeeded. 
       println("Successfully retrieved \(objects!.count) scores.") 
       // Do something with the found objects 
       if let objects = objects as? [PFObject] { 
        for object in objects { 
         dispatch_sync(dispatch_get_main_queue()) { 
          self.BuisnessNames.append(object ["BusinessName"] as! NSString) 
         } 
        } 
       } 
      } else { 
       // Log details of the failure 
       println("Error: \(error!) \(error!.userInfo!)") 
      } 
     } 
    } 
} 

RootVC.swift (наследуется от AppController):

override func viewDidLoad() { 
    if isUserLoggedIn() { 
     dispatch_async(dispatch_get_main_queue()){ 
      self.updateFeedsMap() 
     } 
    } 

RootVC перетекает в третий контроллер представления в ViewDidAppear(), который использует Массив BuisnessNames для заполнения таблицы. Однако в настоящее время я не получаю никаких данных до таблицы. Я потратил много часов на это, и у меня нет идей, пожалуйста, помогите! Спасибо.

ответ

0

Вы ошибаетесь, вы запрашиваете данные в viewDidLoad, процесс асинхронный. Он вернется первым.

Затем вы запускаете segue в ViewDidAppear(), но в это время у вас нет данных с сервера. Так что вы всегда видите пустой стол.

Решение:

Сделать обратный вызов при получении данных. Тогда делать все, что вы хотите с данными

Простой CallBack демо

public func updateFeedsMap(completion:()->()){ 

    var query : PFQuery = PFUser.query()! 
    var objects : [AnyObject]? 
    var counter = 0 

    query.whereKey("isProprietor", equalTo: true) 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]?, error: NSError?) -> Void in 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
      if error == nil { 
       // The find succeeded. 
       println("Successfully retrieved \(objects!.count) scores.") 
       // Do something with the found objects 
       if let objects = objects as? [PFObject] { 
        for object in objects { 
         dispatch_sync(dispatch_get_main_queue()) { 
          self.BuisnessNames.append(object ["BusinessName"] as! NSString) 
         } 
        } 
        //Here your data prase is done 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        completion() 
       }) 
       } 
      } else { 
       // Log details of the failure 
       println("Error: \(error!) \(error!.userInfo!)") 
      } 
     } 
    } 
} 

Затем ваш вызов функции, как этого

self.updateFeedsMap {() ->() in 
     //Here do something with data,reloadTableview or whatever you like 
    } 
+0

Спасибо, Лео, глядя сейчас в CallBacks ... –

+0

Я пробовал различные виды контроля GDC и обертывал разные разделы кодов в рассылке async/sync. Я даже пытался группировать рассылки и использовать обратные вызовы завершения ... еще не удалось это исправить. Не могли бы вы предложить, как бы вы это сделали? –

+0

@ Racer-X Я обновлю некоторый простой код – Leo

0

Нет необходимости в коде GCD, который вы добавили. findObjectsInBackground выполняет GCD для вас и вызывает блок завершения на главном, где вы хотите.

Вы можете удалить рассылки (как в viewDidLoad, так и в блоке завершения поиска). Просто заполните массив данных datasource таблицы и сообщите таблице reloadData. Помните следующие другие таблицы viewchas, например, забыть подключить источник данных и делегировать или забыть инициализировать массив перед его заполнением.

+0

Спасибо за ответ Дань, я сделал, как вы предложили (удален GDC) и добавил reloadData в viewDidLoad третьего VC. Еще ничего! Я уверен, что заголовок таблицы getchas позаботился, так как я могу добавить начальные значения «test» в массив, и они достаточно точно заполняют представление таблицы. –

+0

Хорошо. Позволяет начать запись материала. В блоке завершения регистрируйте объекты, чтобы узнать, что получил запрос. Запишите свой вид таблицы и ваш источник данных таблицы, который должен == self. Запишите массив businessNames. – danh

+0

Привет, danh, я скорректировал код и добавил кнопку, чтобы принудительно перезагрузить tableView после завершения запроса Parse. Этот отладочный тест работал! Я думаю, что мне просто нужно использовать правильный тип GDC, чтобы дождаться заполнения массива businessNames перед загрузкой таблицы. –

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