Проверьте, существует ли этот объект до

-4

В моем приложении пользователь может добавлять имена детей. Я хочу, чтобы этот ребенок не был добавлен раньше, поэтому я могу добавить его. Если он там, появляется сообщение об ошибке. Проблема здесь, я не могу проверить, добавлен ли этот ребенок или нет. Код для проверки никогда не выполняется. Я не знаю почему. Я попытался выяснить проблему во многих отношениях. Но когда код проверки ecxuted, предупреждающее сообщение появляется с черным экраном и добавляет ребенка любым способом!

Вот мой код. Этот код спасает ребенка любым способом, независимо от того, добавлен он или нет.

    let addBaby = PFObject(className: "Baby")

let CheckBaby = PFQuery(className: "Baby")
CheckBaby.whereKey("user1", equalTo: ParentID!)
CheckBaby.whereKey("user2", equalTo: PFUser.currentUser()!)
CheckBaby.findObjectsInBackgroundWithBlock({ (object:[PFObject]?,
error:NSError?) -> Void in

for object in object! {
if object["baby_name"] as! String == self.babyName {
print("This baby has been added before.")
let myAlert = UIAlertController(title:"Error", message:"This baby has been added before.", preferredStyle:UIAlertControllerStyle.Alert)
let okAction = UIAlertAction (title: "OK", style: UIAlertActionStyle.Default, handler: nil)
myAlert.addAction(okAction)
self.presentViewController(myAlert, animated: true, completion: nil)
return}
else{
}
}// end for
})

addBaby.setObject(self.ParentID!, forKey: "user1")
addBaby.setObject(self.babyName.text!, forKey: "baby_name")
addBaby.setObject(self.parentName.text!, forKey: "parent_fname")
addBaby.setObject(self.babyClass.text!, forKey: "class_name")
addBaby.setObject(PFUser.currentUser()!, forKey: "user2")

addBaby.saveInBackgroundWithBlock { (saved:Bool, error:NSError?) -> Void in

if saved {
self.navigationController?.popViewControllerAnimated(true)
} else {
error!.localizedDescription
}
}

Спасибо за помощь!!

спросил(а) 2021-01-25T13:22:04+03:00 5 месяцев назад
1
Решение
89

Ваш код добавляет ребенка независимо от результатов поиска. Ваш код в основном говорит следующее:

Create add baby
Find a baby like this
If there is one like this, display alert
Setup baby to be added
Add the baby
If it works, popview

Вы хотите:

Find a baby like this
If there is one, display alert
If there isn't one
Create baby to add
Setup baby to be added
Add the baby
If it works, pop view

Что-то вроде:

let CheckBaby = PFQuery(className: "Baby")
CheckBaby.whereKey("user1", equalTo: ParentID!)
CheckBaby.whereKey("user2", equalTo: PFUser.currentUser()!)
CheckBaby.findObjectsInBackgroundWithBlock({ (object:[PFObject]?,
error:NSError?) -> Void in

var babyNotFound = true

for object in object! {
if object["baby_name"] as! String == self.babyName {

babyNotFound = false

print("This baby has been added before.")
let myAlert = UIAlertController(title:"Error", message:"This baby has been added before.", preferredStyle:UIAlertControllerStyle.Alert)
let okAction = UIAlertAction (title: "OK", style: UIAlertActionStyle.Default, handler: nil)
myAlert.addAction(okAction)
self.presentViewController(myAlert, animated: true, completion: nil)
return
}
}

if babyNotFound {
let addBaby = PFObject(className: "Baby")

addBaby.setObject(self.ParentID!, forKey: "user1")
addBaby.setObject(self.babyName.text!, forKey: "baby_name")
addBaby.setObject(self.parentName.text!, forKey: "parent_fname")
addBaby.setObject(self.babyClass.text!, forKey: "class_name")
addBaby.setObject(PFUser.currentUser()!, forKey: "user2")

addBaby.saveInBackgroundWithBlock { (saved:Bool, error:NSError?) -> Void in

if saved {
self.navigationController?.popViewControllerAnimated(true)
} else {
error!.localizedDescription
}
}
}
})

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

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

dispatch_async(dispatch_get_main_queue()) {
() -> Void in
self.presentViewController(myAlert, animated: true, completion: nil)
}

ответил(а) 2021-01-25T13:22:04+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема