2017-05-16 2 views
0

Ich versuche, ein benutzerdefiniertes PickerView zu erstellen, das seine Daten von einem API-Aufruf an einen Webserver erhält. Das Problem, das ich habe, speichert die analysierten Daten in einer externen Variablen, damit die PickerView-Protokollmethoden darauf zugreifen können.Wie kann eine Variable in einer externen Variable gespeichert werden?

// 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 
     } 
    } 
} 

Das Problem, das ich habe, ist, dass customDS jedes Mal nil zurückgibt.

Was mache ich hier falsch?

+0

Wo greifen Sie auf customDS zu? –

+0

Ich habe den Codeblock für den Zugriff auf customDS hinzugefügt. – manohjay

Antwort

2

Im Completion-Block von makeApiCall laden Sie einfach Ihre pickerView's Komponente auf Haupt-Thread und Sie alle zu gehen.

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

Das hat den Trick gemacht, danke! Aus irgendeinem Grund dachte ich PickerView verwendet ReloadData() wie TableView verwendet. Danke nochmal! – manohjay

Verwandte Themen