Возврат из вложенной функции

-1

Я пытаюсь понять, как вернуть значение из внутри вложенной функции в ее родительскую функцию. Код, с которым я работаю:

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, который позволяет вам возвращать значение непосредственно к "родительской" функции из внутри вложенной функции?

Благодарю. Любая помощь приветствуется.

Теги:
parse.com
nested-function

1 ответ

1
Лучший ответ

Вы неправильно понимаете, как работают асинхронные вызовы с завершающими блоками/закрытиями.

Вы не можете вернуть результат в свою функцию, потому что в момент возвращения функции результат еще не существует.

Функция findObjectsInBackgroundFromLocalDataStoreIfPossible берет замыкание (блок кода) в качестве параметра. Он возвращается немедленно, прежде чем фоновый сетевой запрос даже был отправлен, а тем более обработан.

Затем вы забудете о фоновой задаче и ждите. После завершения фоновой задачи он вызывает ваше закрытие.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню