【问题标题】:Swift 4 accessing completionhandler returned value from class variableSwift 4 访问完成处理程序从类变量返回值
【发布时间】:2018-02-12 22:07:02
【问题描述】:

问题:我正在尝试访问从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
}

【问题讨论】:

  • 提供给getMarkets 的完成处理程序中的print 工作正常,因为它在getMarketFromDb 调用成功时被调用。闭包后的 print 无法按预期工作,因为它是在上一行之后立即调用的,无需等待 getMarketFromDb 完成。
  • 感谢您的回答,有没有办法将值分配给类中的另一个变量?或任何其他建议?
  • 作业不是问题。问题是您在变量准备好之前访问它(在异步调用getMarketFromDb之前)。

标签: ios swift asynchronous swift4 completionhandler


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多