首页 > 解决方案 > 从 api 调用获取数据后无法更新实例变量

问题描述

这是我的类中的实例变量
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 循环上设置断点时,它显示餐厅实例变量为空)。

标签: swiftamazon-dynamodb

解决方案


你打错电话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()
})

推荐阅读