Я пытаюсь понять, как вернуть значение из внутри вложенной функции в ее родительскую функцию. Код, с которым я работаю:
func findObjectsInBackgroundFromLocalDataStoreIfPossible (query: PFQuery, toCallUponCompletion: () -> ()) -> [PFObject]{
var response = [PFObject]()
let queryCopy = query.copy() as! PFQuery
queryCopy.fromLocalDatastore()
queryCopy.findObjectsInBackgroundWithBlock{
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil{
if objects?.count == 0{
query.findObjectsInBackgroundWithBlock{
(objects2: [AnyObject]?, error: NSError?) -> Void in
if error == nil{
response = objects2 as! [PFObject]
}
}
}
else{
response = objects as! [PFObject]
}
}
toCallUponCompletion()
}
}
Мне нужно вернуть ответ изнутри функции, потому что он может вернуться только после завершения запроса, но если я попытаюсь это сделать, компилятор жалуется, что я не могу этого сделать, потому что возвращаемый тип вложенной функции - Void
. Есть ли синтаксис Swift, который позволяет вам возвращать значение непосредственно к "родительской" функции из внутри вложенной функции?
Благодарю. Любая помощь приветствуется.
Вы неправильно понимаете, как работают асинхронные вызовы с завершающими блоками/закрытиями.
Вы не можете вернуть результат в свою функцию, потому что в момент возвращения функции результат еще не существует.
Функция findObjectsInBackgroundFromLocalDataStoreIfPossible берет замыкание (блок кода) в качестве параметра. Он возвращается немедленно, прежде чем фоновый сетевой запрос даже был отправлен, а тем более обработан.
Затем вы забудете о фоновой задаче и ждите. После завершения фоновой задачи он вызывает ваше закрытие.