#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
к andself.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, но я просто попытался его преобразовать.