Добавление нескольких результатов запроса в массив

#ios #swift #parse-platform

#iOS #swift #синтаксический анализ-платформа

Вопрос:

Я пытаюсь выполнить 4 запроса из моей базы данных синтаксического анализа, каждый из которых извлекает только 1 объект. Я пытаюсь добавить каждый из объектов в массив, который затем можно использовать в представлении коллекции. Запросы выполняются успешно, но приложение выходит из строя, потому что оно извлекает нулевые значения. Вот мой код:

 var query1desc = ""
var query2desc = ""
var descs = [String]()

fileprivate func fetchUsers() {

        let query1 = PFQuery(className: "Messages")
        query1.limit = 1
        query1.findObjectsInBackground{
            (objects, error) -> Void in
            if error == nil {
                if objects?.count == 0 {
                 } else {
                    let object = objects![0] as! PFObject
                    self.query1desc = object["message"] as! String
                }

            }
        }
            let query2 = PFQuery(className: "Messages")
            query2.limit = 1
            query2.findObjectsInBackground{
                (objects, error) -> Void in
                if error == nil {
                    if objects?.count == 0 {
                       } else {
                       let object = objects![0] as! PFObject
                       self.query2desc = object["message"] as! String
                    }
                 }
            }

self.descs = [self.query1desc, self.query2desc]
self.collectionView.reloadData()
  

Кто-нибудь знает способ исправить это, чтобы self.descs не просто предоставлял нулевые значения? Когда я печатаю внутри самого запроса, я знаю, что объекты извлекаются. Заранее спасибо.

Комментарии:

1. Запросы выполняются в фоновом режиме, поэтому вы не можете получить доступ self.query1desc к and self.query2desc там. Вам необходимо получить к ним доступ в блоках завершения или, возможно, использовать dispatch_group и dispatch_group_notify

2. Разве (objects, error) -> Void не находится в блоке завершения?

3. Да, но последние две строки будут выполнены до выполнения блока завершения, поэтому эти свойства будут равны нулю.

Ответ №1:

Я думаю, что переменная desc имеет нулевое значение, потому что ваша программа выполняет часть кода назначения массива, в то время как обработчики завершения все еще обрабатывают запросы запросов. Вам нужно дождаться завершения всех ваших запросов, а затем собрать все результаты.

 let workGroup = DispatchGroup()

let queueForQuery1 = DispatchQueue(label: "firstQuery")
let query1 = PFQuery(className: "Messages")
query1.limit = 1

workGroup.enter()

queueForQuery1.async(group:workGroup) { 

    query1.findObjectsInBackground{ (objects, error) -> Void in

        if error == nil {
            if objects?.count == 0 {
            } else {
                let object = objects![0] as! PFObject
                self.query1desc = object["message"] as! String
             }
       }
       workGroup.leave()
    }
}

let queueForQuery2 = DispatchQueue(label: "secondQuery")
let query2 = PFQuery(className: "Messages")
query2.limit = 1

workGroup.enter()


queueForQuery2.async(group:workGroup) { 

    query2.findObjectsInBackground{ (objects, error) -> Void in

        if error == nil {
            if objects?.count == 0 {
            } else {
                let object = objects![0] as! PFObject
                self.query1desc = object["message"] as! String
             }
       }
       workGroup.leave()
    }
}

workGroup.notify(queue: DispatchQueue.main){
    self.descs = [self.query1desc, self.query2desc]
    self.collectionView.reloadData()
}
  

Комментарии:

1. Мне трудно, потому что он не работает с Swift 3. Это единственный раздел, вызывающий у меня проблемы. DispatchGroup.notify(очередь: рабочая группа){ self.descs = [self. query1desc, self. query2desc] self.CarouselView.reloadData() }

2. Я обновил свой ответ. Я не писал код gcd в Swift 3, но я просто попытался его преобразовать.