Я создал класс, чем упростил реализацию разработчика. В методах Datasource UIPickerView я возвращаю значения из закрытия. Пример:Запуск закрытия по основной теме
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerNumberOfRows!(component: component)
}
Я использую то же самое для всех методов источника данных. Когда я запускаю приложение, он отображает сборщик на экране без каких-либо данных. Проблема в том, что я получаю данные от закрытий, которые, в свою очередь, не работают в основном потоке.
Есть ли способ запустить это закрытие основного потока и убедиться, что он возвращает значение, подходящее для типа возвращаемого значения функции источника данных? (Например, из приведенного выше примера, то замыкание возвращает Int)
EDIT:
Я знаю, используя dispatch_async. Однако в моем случае это не поможет мне. Скажем, я создал функцию, которая запускает замыкание на основной поток и должна возвращать значение будет выглядеть примерно так:
func closureOnMainThread()->Int{
dispatch_async(dispatch_get_main_queue()) {
// Run your code here
return self.pickerNumberOfRows!(component: 0)
}
return 0
}
Однако Существует проблема в функции, над которой возвращается 0 до возвращения значение внутри блока отправки.
Редактировать 2: Чтобы все было ясно. Мой код содержит пользовательский класс для сборщика и UIViewController его реализации:
class CustomPickerView: NSObject, UIPickerViewDelegate, UIPickerViewDataSource {
var pickerNumberOfRows: ((component: Int)->Int)?
//MARK: UIPickerViewDatasource Methods
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerNumberOfRows!(component: component)
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return pickerNumberOfComponents!()
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {print("Hello")
return pickerRowTitle!(forRow: row, inComponent: component)
}
//MARK: UIPickerViewDelegate Methods
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
pickerDidSelect!(row: row, component: component)
}
}
UIViewController (Просмотр ли Load):
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let picker = CustomPickerView(parent: self)
picker.pickerNumberOfRows = { component in
return 10
}
}
Пожалуйста, обратите внимание, что я удалил, выделяют вспомогательных функций между таким образом, чтобы вы фокусируетесь на основной части кода.
Разработчик может передать логику, которую он хочет, в переменных замыканий.
Вы можете использовать 'dispatch_async (dispatch_get_main_queue()) {// Do your stuff}', чтобы получить основной поток внутри закрытия. Вы можете решить поместить в него весь код закрытия или просто когда вы закончили некоторые вещи раньше. – Larme
Обратите внимание, что команда return self.pickerNumberOfRows! (Component: 0) не будет автоматически возвращать это значение в closOnMainThread, но только для закрытия dispatch_async (и никто не читает это возвращаемое значение в вашем примере). Мое предложение: используйте Семафоры (https://www.raywenderlich.com/79150/grand-central-dispatch-tutorial-swift-part-2). –
вы не можете поместить 'dispatch_async' в' shutOnMainThread', как это. Это асинхронный процесс, поэтому он будет возвращать 0, определенный за пределами блока GCD. Поэтому внутри кода закрытия должна быть какая-то проблема. Отправьте это тоже. – RJE