Не могу обновить переменные экземпляра после получения данных от вызова API - PullRequest
0 голосов
/ 31 декабря 2018

Это переменная экземпляра в моем классе
var restaurant = String;

    override func viewDidLoad() {
    super.viewDidLoad()

    self.pool = AWSCognitoIdentityUserPool(forKey: AWSCognitoUserPoolsSignInProviderKey)
    if (self.user == nil) {
        self.user = self.pool?.currentUser()
    }
    self.title = self.user?.username
    // fills the list with a certain data set 
    //self.refresh()

Это мой блок завершения

    grabData {
        for values in self.restaurants{
            print(values)
        }
    }


}

Это функция, выполняющая вызов API

func grabData(completion : @escaping() -> ()){

    let databaseMap = AWSDynamoDBObjectMapper.default()
    let expression = AWSDynamoDBScanExpression()


    databaseMap.scan(Restaraunt.self, expression: expression,completionHandler:{(response:AWSDynamoDBPaginatedOutput?,error:Error?)-> Void in

        // testing the response
        if(response != nil){
            print("got a reponse")
            if(response?.items.count == 0)
            {
                print("did not get a response")
            }else{


                for item in (response?.items)!{

                    let data: Restaraunt = item as! Restaraunt;

                    let name: String = data._name as! String;
                    self.restaurants.append(name)
                }

            }                
       }
   })

   completion()
}

Кажется, что функция не обновляет переменную экземпляра, я знаю, что я получаю правильные данные после того, как я установил некоторые точки останова.(Когда я устанавливаю точку останова в цикле for, переменная экземпляра restaurant показывает, что она пуста).

1 Ответ

0 голосов
/ 31 декабря 2018

Вы звоните completion() неправильно.Он вызывается до того, как вы действительно получите свои данные.Вы должны вызвать его из обработчика завершения:

databaseMap.scan(Restaraunt.self, expression: expression, completionHandler: { (response: AWSDynamoDBPaginatedOutput?, error: Error?) in

    // testing the response
    if (response != nil){
        print("got a reponse")

        if (response?.items.count == 0) {
            print("did not get a response")
        } else {
            for item in (response?.items)! {
                let data: Restaraunt = item as! Restaraunt;
                let name: String = data._name as! String;
                self.restaurants.append(name)
            }
        }                
    }

    // this has to be inside the closure
    completion()
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...