如何将闭包中的变量保存到外部变量?

Posted

技术标签:

【中文标题】如何将闭包中的变量保存到外部变量?【英文标题】:How to save variable in closure to external variable? 【发布时间】:2017-05-16 15:30:17 【问题描述】:

我正在尝试创建一个自定义 PickerView,它从 API 调用获取数据到网络服务器。我遇到的问题是将解析后的数据保存到外部变量中,以便 PickerView 协议方法可以访问它。

// API Call / Parsing using Alamofire + Unbox
static func makeApiCall(completionHandler: @escaping (CustomDataStructure) -> ()) 
    Alamofire.request(webserverUrl, method: .get).responseObject  (response: DataResponse<Experiment>) in
        switch response.result 
            case .success:
                if var configParams = response.result.value 
                    let inputConfigs = removeExtrasParams(experiment: response.result.value!)
                    let modifiedViewModel = modifyViewModel(experiment: &configParams, inputConfigs: inputConfigs)
                    completionHandler(modifiedViewModel)
                
            case .failure(_):
                break
        
    


// Custom PickerClass
class CustomPickerView: UIPickerView 
    fileprivate var customDS: CustomDataStructure?

    override init() 
        super.init()

        dataSource = self
        delegate = self

        SomeClass.makeApiCall(completionHandler:  customds in
            self.customDS = customds
        )
    

    ...


extension CustomPickerView: UIPickerViewDelegate 
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
    

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
        if let customds = customDS 
            if let customDSValues = customds.inputs.first?.value 
                return customDSValues[row]
            
        
        return "apple"
    


extension CustomPickerView: UIPickerViewDataSource 
    func numberOfComponents(in pickerView: UIPickerView) -> Int 
        return 1
    

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
        if let customds = customDS 
            return customds.inputs.values.count
         else 
            return 0
        
    

我遇到的问题是 customDS 每次都返回 nil。

我在这里做错了什么?

【问题讨论】:

您在哪里访问 customDS? 我添加了用于访问 customDS 的代码块。 【参考方案1】:

makeApiCall 的完成块中,只需在主线程上重新加载您的pickerView's 组件,就可以开始了。

SomeClass.makeApiCall(completionHandler:  customds in
    self.customDS = customds
    DispatchQueue.main.async 
        self.reloadComponent(0) 
    
)

【讨论】:

这成功了,谢谢!出于某种原因,我认为 PickerView 使用 reloadData() 就像 TableView 使用的那样。再次感谢!

以上是关于如何将闭包中的变量保存到外部变量?的主要内容,如果未能解决你的问题,请参考以下文章

闭包的理解

再谈JavaScript中的闭包

JavaScript闭包

C#和 JS的闭包

闭包详解,柯里化的含义及操作方法

PHP 闭包获取外部变量和global关键字声明变量的区别