2017-05-16 16 views
0

私は、WebサーバーへのAPI呼び出しからデータを取得するカスタムPickerViewを作成しようとしています。私が抱えている問題は、解析されたデータを外部変数に保存して、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を返すことです。

私はここで間違っていますか?

+0

customDSにはどこにアクセスしていますか? –

+0

私はcustomDSにアクセスしている場所のコードブロックを追加しました。 – manohjay

答えて

2

makeApiCallの完了ブロックで、pickerView'sコンポーネントをメインスレッドにリロードするだけで、すべての設定が完了します。

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

これはトリック、ありがとう! 何らかの理由で、私はPickerViewは、TableViewのようにreloadData()を使うと考えました。 もう一度おねがいします! – manohjay

関連する問題