Swift 4从类变量中访问completionhandler返回的值

时间:2018-02-12 22:07:03

标签: ios swift asynchronous swift4 completionhandler

问题:我正在尝试访问从completionHandler返回的值,将其分配给一个超出completionHandler返回方法范围的变量。我可以访问方法范围内的变量,但我无法从外部访问。我在访问时尝试将其分配给类变量,但是没有用。有什么想法吗?

var marketler = [MarketModel]()
var marketAdiArray = [String]()

override func viewDidLoad() {
    getMarkets { (marketdizi) in
        self.objAryToTableView(markets: marketdizi)
        print(self.marketAdiArray) // -> this returns the right array
    }

    print(self.marketAdiArray) // -> this returns an empty array
 }

func getMarkets(completionHandler : @escaping ([MarketModel])->()) {
    let uid = "userID(02)"
    print("uid : \(uid)")
    MobileUserViewModel().getUser(userId: uid, completionHandler: { (user) in
// here returns an user object
        self.loginUser = user
        MarketViewModel().getMarketFromDb(mobilUser: user, completionHandler: { (marketler) in
            print("marketler : \(marketler)")
            completionHandler(marketler)
        })
    })
}

 func objAryToTableView(markets : [MarketModel]) {
    var ary = [String]()
    for m in markets {
        ary.append(m.marketName as String!)
    }
    self.marketAdiArray = ary
}

1 个答案:

答案 0 :(得分:1)

getMarketFromDb调用成功后,块(完成处理程序)内的代码将被执行。块之外的代码就在前一行之后执行,你不会在阵列上有任何数据。

如果您需要触发从数据Db更新数据的UI更新,则需要从完成块内部调用UI更新。

getMarkets { (marketdizi) in

         self.objAryToTableView(markets: marketdizi)
         print(self.marketAdiArray) // -> this returns the right array
         self.tableView.reloadData()

    }
    print(self.marketAdiArray) // -> this returns an empty array